新建项目
打开Qt Creator,新建项目,然后一路next
到这一步baseclass有三种选择:
- QMainWindow:主窗口基类,相较于QWidget,多了菜单栏等杂七杂八的东西。
- QWidget:最基础的窗口基类,QMainWindow和QDialog都是它的子类
- QDialog:对话窗基类
下面的widget.ui是UI文件。
选QWidget,接着一路next
完成后,直接ctrl+R,构建,就能看到项目的窗口了
如果中间出现什么问题,例如not suitable toolkit之类的,自行解决,搞不好证明C++还没学好,先去学C++。
项目架构
几个重要的类:
- QApplication:Qt中的核心类,用于自动处理事件循环,全局设置等事项,每个项目都要用,可以看作是Qt初始化。
- Widget:这个就是前面自己命名的类,就是自己的主窗口类
- QWidget:构件基类,所有构件都继承这个类,这个类又继承于QObject类,
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv); //Qt提供的核心类,实现事件循环,全局设置等功能,所有程序都要用到。
Widget w;
w.show(); //用于更新窗口显示
return a.exec(); //启动事件循环
}
UI文件:widget.ui,这个文件不能直接修改,是在”设计“中可视化修改的,双击widget.ui文件,会自动进入设计模式。
设计模式下可以进行构件拖拽,大致流程就是:拖进去需要的构件,右侧属性框里改一下名字,几个构件想要对齐的时候,可以选中多个,然后点击上面的布局(就显示框上面那几个蓝色方块)
构件可以通过右键,修改样式表进行美化,Qt的样式表和CSS基本一致。还可以添加图像文件,用作background或者icon
到此,一个毫无用处的界面就OK了。
控制逻辑
信号与槽
Qt中的信号与槽机制是非常重要的事件通信机制。
- 信号(signals):发生事件时发出信息,QPushButton有clicked()信号,当被点击时发出。
- 槽(slots):用来相应信号的函数办法(类似于回调函数或者hook),当信号发出时,函数被调用。
可以直接在UI文件设计界面下面添加信号和槽。还可以用以下代码方式连接:
- QObject::connect
- Lambda表达式
- 函数指针
- 自动生成槽函数
Qt中还可以自定义信号和槽函数,定义信号函数的时候前面要加signals关键字(信号函数只需要声明,不需要实现,信号函数的输入会传递给槽函数),定义槽函数前面要加slots关键字,发射信号即emit mySignal(123)
,这样就可以触发槽函数了。
Qt中所有事情都是围绕构件展开的,信号和槽也不例外,定义信号和槽函数也都是构件的成员函数,连接的时候也是要指定信号是由哪个对象发出的哪个信号函数,哪个对象用哪个槽函数接收这个信号。
事件机制
Qt中所有的通信都是基于事件来进行的,用户的所有操作都是事件,即使只是挪动了一下鼠标,还有一些事件是系统自动发出的,例如定时器。
Qt中一个事件的处理过程:事件产生->事件派发->事件过滤->事件分发->事件处理
信号与槽是一种特殊的事件
感觉Qt有点像一个大的状态机,每一个事件就是一次状态的转移。
- 事件派发:QApplication将事件分发到指定构件
- 分发过程中可以采用过滤器对事件进行过滤,默认不过滤
- 分发到指定构件后,事件分发器根据事件类型分配给指定的处理函数
Qt主要内容大概也就这样,麻雀虽小,五脏俱全,掌握UI设计,信号槽机制,事件机制,已经足够实现简单的APP了。