参考:https://zhuanlan.zhihu.com/p/28225011
QT版本为5.12.4
1.main.cpp
1 #include "widget.h" 2 #include <QApplication> 3 4 int main(int argc, char *argv[]) 5 { 6 QApplication a(argc, argv); 7 Widget w; 8 w.show(); 9 10 return a.exec(); 11 }
为了叙述方便,现约定:在以后的代码分析中,方括号中的数字代表行号,例如【1-3】表示第1行到第3行的代码。
【1】包含widget.h头文件,这是我们创建窗口类时,Qt自动为我们生成的头文件,且文件名都为小写。
【2】包含QApplication类。
【4-11】main函数。
【6】创建一个QApplication实例。
如果所创建的是一个窗口应用程序,那么必须要有且只有一个这样的实例,在创建QApplication实例后,会自动将指针赋值给Qt的全局变量qApp,如果想在其它地方使用QApplication实例,则可以直接调用qApp。
因为QApplication实例会进行大量的初始化工作,所以要在使用任何对象之前就创建QApplication实例,因此,main函数开头便创建了QApplication实例。
如果创建的是一个非窗口的应用程序,那么可以调用QCoreApplication来创建实例。
QApplication主要做以下事情(只需了解即可):
1:使用用户的桌面设置,初始化应用程序,例如窗口的调色板,字体等。
2:执行事件处理。
3:也可根据命令行参数,设置自己的内部状态。
4:制定窗口样式,颜色调配,文字国际化。
5:设置剪切板,管理鼠标事件。
【7-8】创建Widget实例,并显示。
【10】进入Qt的主循环事件。当调用exit()函数时,才会退出循环,退出main函数。当程序在准备退出主循环时,会发出aboutToQuit()信号,如果有某些在退出程序前要处理的事情,可链接此信号进行处理。除了主循环外,Qt还有本地循环,可以理解为子循环,这个会在后面的讲解中讲述。
2.widget.h
1 #ifndef WIDGET_H 2 #define WIDGET_H 3 4 #include <QWidget> 5 6 namespace Ui { 7 class Widget; 8 } 9 10 class Widget : public QWidget 11 { 12 Q_OBJECT 13 14 public: 15 explicit Widget(QWidget *parent = nullptr); 16 ~Widget(); 17 18 private: 19 Ui::Widget *ui; 20 }; 21 22 #endif // WIDGET_H
【6~8】定义命名空间Ui
【10】Widget公有继承QWidget,这样我们就可以调用QWidget提供的方法。QWidget是所有Qt窗口控件的基类,一般情况自定义窗口控件都应该继承QWidget或其子类。
【12】Q_OBJECT宏,必须在类的私有声明中声明这个宏,这样就可以使用Qt的信号槽机制,元对象系统,对象树等Qt特有的功能,否则无法使用。所以这里推荐在创建类时,最好加上此声明,这样的代码会得到很多Qt提供的便利接口。
【15】构造函数,其中parent参数,可指定父窗口。
【19】ui界面对象指针,凡是需要ui界面中的控件对象指针,都可以通过这个指针来进行调用访问。
3.widget.cpp
1 #include "widget.h" 2 #include "ui_widget.h" 3 4 Widget::Widget(QWidget *parent) : 5 QWidget(parent), 6 ui(new Ui::Widget) 7 { 8 ui->setupUi(this); 9 } 10 11 Widget::~Widget() 12 { 13 delete ui; 14 }
【5】如果有参数parent不为空,则Widget会成为该指针所指窗口的子窗口
【6】创建Ui::Widget界面对象,并将指针赋值给ui,创建的对象会在析构函数中释放
【8】设置ui界面