Qt GUI内部 - 控件绘制?

4
我已经使用QT有一段时间了,一直在思考关于Windows中GUI绘制方式的问题。它是真的使用QPainter来绘制所有按钮、编辑框、组合框、复选框、标签等吗?还是它以某种方式使用本地小部件?
它能够进行自定义样式和皮肤设计这一事实表明,它确实使用QPainter绘制所有东西,但这种代码如何可能得以维护?Qt开发者真的反向工程了整个窗口系统的功能吗?这不是有些浪费吗?
另一个证据是,如果我在Qt GUI上使用Spy++,那么所有的窗口都会显示为“QWidget”类名。如果它使用本地小部件,这些应该是“BUTTON”,“STATIC”等吧?
其他平台上呢?在Max OSX上是否也是这样做的呢?
3个回答

7
在Windows XP和Vista上(除非显示设置为Classic),通过QWindowsXPStyleQWindowsVistaStyle绘制小部件实际上使用低级主题特定的绘图(uxtheme.dll),以使例如推按钮看起来像本机按钮。 在旧版Windows上,Qt通过QWindowsStyle模拟小部件绘制。
在Mac OS X上情况类似,QMacStyle依赖Appearance Manager委托小部件的低级绘制。
对于X11,通常Qt使用自己的样式绘制,并具有模拟某些窗口系统的特定样式,例如QMotifStyle类似于Motif的外观和感觉,而不需要加载和依赖Motif环境。但是在GNOME下运行时,Qt可以通过QGtkStyle使用本机的Gtk+主题。

4

QWindowsXPStyle documentation提到:

“警告:此样式仅在Windows XP平台上可用,因为它利用了Windows XP的样式引擎。”

Qt Wikipedia页面提到:

“使用本地UI渲染API

Qt曾经模拟其目标平台的本地外观,这有时会导致模拟不完美的轻微差异。最新版本的Qt使用不同平台的本地API来绘制Qt控件,因此不会出现这些问题。[24](另请参见wxWidgets,它为大多数小部件功能使用本机API。)”


1

Qt确实自己绘制所有的小部件(无论是使用平台主题API还是“原始”的GDI / X等都没有关系)。如果它使用本地小部件(例如wxWindows),那么几乎不可能钩入样式以更改最微小的细节,更不用说使用现成的小部件来添加自定义功能了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接