写在前面
Qt 是一个建立在 C++ 之上的框架,它扩展了 C++ 的功能,使得开发者可以更容易地开发跨平台的应用程序。Qt 的设计哲学和功能集都与 C++ 紧密相关,但同时也提供了比纯 C++ 更高的生产力和更丰富的功能。
Qt如何在C++基础上扩展的
这里新建一个C++项目和QWidget项目比较。
自动生成的文件及代码比较:
属性页比较:
可以看到创建的Qt项目比标准C++项目多了了几行代码,多了几个Qt相关的配置。
多出的代码如下:
QApplication a(argc, argv); //创建一个唯一的QApplication对象
QObjectTest w; //创建了一个QWidget对象
w.show(); //显示QWidget对象
return a.exec(); //进入唯一的QApplication对象的消息循环
可以看到创建Qt项目时,会自动创建一个QApplication对象和一个窗体对象,然后显示这个窗体并进入桌面应用都必须要有的消息循环。
Qt项目多出的配置如下:
可以看到多出的配置有:
Qt Project Settings(同.pro文件),Qt项目相关配置
Qt Meta-Object Complier: Qt元对象编译器moc,用来编译所有带Q_OBJECT宏的类所属的源文件。
Qt Resource Complier: Qt资源对象编译器rcc,用来编译Qt资源文件.qrc。这里还包含了Qt Quick Complier编译器,用来编译QML,这里以QWidget为主,不作讨论。
Qt User Interface Complier: Qt用户界面编译器uic,用来编译用户界面文件.ui。
这几个编译器是何时作用的,这里编译项目看编译输出:
至此可以知道Qt在C++项目的编译编译流程中添加了uic、rcc、moc等编译器的编译,如图:
普通C++类使用Qt核心特性
要想使普通C++类附带Qt的核心特性,需满足:
①必须在Qt开发环境(即Qt项目)中
②使该类继承QObject
③声明Q_OBJECT宏
这里创建一个C++类CppTest:
重新生成,可以看到直接到编译步骤,未涉及Qt相关的编译:
添加QObject类继承以及Q_OBJECT宏后,重新编译:
注意:继承QObject、添加Q_OBJECT宏缺一不可!!!
单独继承QObject而不声明Q_OBJECT宏,不会进入Qt相关编译流程:
单独声明Q_OBJECT宏,而不继承Q_Object,编译报错:
C++类继承QObject并添加Q_OBJECT宏后,就可以在该类中使用Qt的动态属性、GUI、信号和槽、模型/视图、插件、绘图、动画等核心特性了。
标准C++项目无法直接转成Qt项目
无法在VS中通过配置设置添加Qt环境!!!
无法在VS中通过配置设置添加Qt环境!!!
无法在VS中通过配置设置添加Qt环境!!!
即属性中只能添加Qt相关的头文件和库,无法改变当前项目的编译过程(无法添加moc元对象编译器、uic用户界面文件编译器、qrc资源文件编译器及相应的配置选项)。
<