4

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

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

在其他平台上呢?它在 Max OSX 中也做同样的事情吗?

4

3 回答 3

7

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

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

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

于 2009-03-24T15:43:21.737 回答
4

QWindowsXPStyle文档有这样的说法:

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

Qt Wikipedia 页面有这样的说法:

“使用原生 UI 渲染 API

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

于 2009-03-24T10:16:13.287 回答
1

Qt 确实绘制了所有小部件本身(无论是使用平台主题 API 还是“原始”GDI/X/等都无关紧要)。如果它使用本机小部件(如 wxWindows 那样),几乎不可能连接到样式以更改最细微的细节,更不用说使用现成的小部件在顶部添加自定义功能了。

于 2009-07-21T17:16:58.647 回答