Qt GUI内部 - 小部件绘画?

时间:2009-03-24 09:02:54

标签: windows macos qt user-interface widget

我一直在使用QT一段时间了,我一直想知道在Windows中绘制GUI的方式。
是真的使用QPainter自行绘制所有按钮,编辑框,组合框,复选框,选项卡等,还是以某种方式使用本机窗口小部件?

它可以进行自定义样式和蒙皮的事实表明它确实使用QPainter绘制了所有内容,但是如何才能维护这种代码? Qt开发人员是否真的对窗口系统的整个功能进行了逆向工程?是不是有点浪费? 另一个证据是,如果我在Qt gui上使用Spy ++,那么所有窗口都会显示一个等于“QWidget”的类名。如果它使用原生小部件不应该是“按钮”,“静态”等吗?

在其他平台上怎么样?它在Max OSX中也是这样做的吗?

3 个答案:

答案 0 :(得分:7)

在Windows XP和Vista上(当显示设置设置为经典时除外),通过QWindowsXPStyleQWindowsVistaStyle的小部件绘画实际上使用了低级主题特定的绘图(uxtheme.dll)那个,例如按钮看起来像原生按钮。在旧版本的Windows上,Qt通过QWindowsStyle模拟小部件绘画。

Mac OS X上的情况类似,QMacStyle依赖于外观管理器来委托小部件的低级绘制。

对于X11,通常Qt使用自己的风格绘画,并且具有模仿某些窗口系统的某些样式,例如QMotifStyle与Motif具有相似的外观并且没有实际负载,并且依赖于Motif环境。但是,当在GNOME下运行时,可选择Qt可以通过QGtkStyle使用原生Gtk +主题。

答案 1 :(得分:4)

QWindowsXPStyle documentation有这样说:

“警告:此样式仅适用于Windows XP平台,因为它使用的是Windows XP的样式引擎。”

Qt Wikipedia page有这样说:

“使用本机UI呈现API

Qt过去常常模仿其预期平台的原生外观,偶尔会导致模拟不完美的轻微差异。 Qt的最新版本使用不同平台的本机API来绘制Qt控件,因此不会遇到此类问题。[24] (另请参阅wxWidgets,它为大多数小部件功能使用本机API。)“

答案 2 :(得分:1)

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