深度定制 Qt 树形控件选中样式

试验环境:

  • Windows 11
  • Qt 5.15.2

特别说明试验环境是有原因的。Qt 开发的程序在不同操作系统上有不同的显示效果——即风格,这比较好理解。但是,不同版本的 Qt 在同一操作系统上的显示效果也是有不同的。以树形控件为例,Qt 5.15.2 和 6.7.1 版本下 selectItems 行为的选中样式是不同的,要注意版本升级问题,这是我踩过的坑。

阅读更多

VS2019 编译 QtPropertyBrowser 源码

尝试在 VS 2019 中导入 QtPropertyBrowser 源码到 VS 工程(vcxproj)进行编译时,遇到如下编译错误:

1
2
3
4
5
6
7
1>moc_qtpropertybrowser.cpp
1>E:\QtPropertyBrowserDemo\QtPropertyBrowserDemo\x64\Debug\moc\moc_qtbuttonpropertybrowser.cpp(94,29): error C2027: 使用了未定义类型“QtButtonPropertyBrowserPrivate”
1>E:\QtPropertyBrowserDemo\QtPropertyBrowserDemo\qtpropertybrowser\qtbuttonpropertybrowser.h(47): message : 参见“QtButtonPropertyBrowserPrivate”的声明
1>E:\QtPropertyBrowserDemo\QtPropertyBrowserDemo\x64\Debug\moc\moc_qtbuttonpropertybrowser.cpp(95,29): error C2027: 使用了未定义类型“QtButtonPropertyBrowserPrivate”
1>E:\QtPropertyBrowserDemo\QtPropertyBrowserDemo\qtpropertybrowser\qtbuttonpropertybrowser.h(47): message : 参见“QtButtonPropertyBrowserPrivate”的声明
1>E:\QtPropertyBrowserDemo\QtPropertyBrowserDemo\x64\Debug\moc\moc_qtbuttonpropertybrowser.cpp(96,29): error C2027: 使用了未定义类型“QtButtonPropertyBrowserPrivate”
1>E:\QtPropertyBrowserDemo\QtPropertyBrowserDemo\qtpropertybrowser\qtbuttonpropertybrowser.h(47): message : 参见“QtButtonPropertyBrowserPrivate”的声明

解决办法如下:

在 VS 项目目录内右键对应 moc 文件的头文件,选中属性—Qt Meta-Object Compiler—moc,将 C++ Dynamic Source 值从 “Output File” 改为 “Disable”,重新编译即可。

简言之,这个项的作用是将当前文件中 Qt 类生成的 moc 源文件在编译阶段动态添加到编译器的源码文件列表中。 因为 Private 类的定义在 x.cpp 文件而非 x.h 中,导致编译 moc_x.cpp 时找不到类定义。

项值 Disable 即不将 moc_x.cpp 动态添加到编译器中。这么做是没问题的,因为 QtPropertyBrowser 相关源文件的最后都已显式 include 了对应的 moc.cpp。

具体可参考:

https://forum.qt.io/topic/119401/how-to-compile-source-code-of-qtpropertybrowser-by-vs2019-correctly

https://www.qt.io/blog/2018/01/24/qt-visual-studio-new-approach-based-msbuild