QT概述
QT是一个跨平台的C++图形用户界面应用程序框架,是面向对象的。
划重点:!!!
- 跨平台
- 语言:C++
- 图形用户界面应用程序框架(我的理解,就是可视化工具)
创建QT项目
- 打开 QT Creator(不得不说,之前装过几次QT,也不知道各个组件是干嘛的,一打开文件夹看到一群图标,就人傻了),所以,再次提醒我自己,创建项目用的是QT Creator!!!
- 打开之后长这样
- 创建项目
按照1,2,3的顺序点击(这里,各种项目的类型我还没搞明白,只能先记住了…)
先对新创建的项目命名,然后选择项目存储的路径,最后,点击下一步
这一步,选择的是编译套件,(QT会自动帮你选择)点击下一步
这一步,系统默认添加一个继承子自CMainWindow的类,在这里可以修改类的名字和基类。
连续两次,点击下一步,既可创建出一个QT程序
创建完之后,会弹出这样的页面。
QMainWindow 是主窗口类,主窗口具有菜单栏、工具栏和状态栏,类似于一般的应用程序的主窗口
QWidget是所有具有可视化界面类的基类,选择QWidget创建的界面对各种界面组件都可以支持
QDialog是对话框类,可建立一个基于对话框的界面
点开你刚刚创建的文件夹,或者是,你存放项目的文件夹,都能看到这几个文件,下面解释一下它们
.pro文件
.pro就是工程文件(project),他是qmake自动生成的用于生产makefile的配置文件。
一般情况下,.pro文件的文件格式
模板变量:TEMPLATE,这个玩意儿告诉qmake为这个应用程序生成哪种makefile
Headers 分组
该节点下是项目内所有的头文件(.h)
Sources 分组
该项目内的所有C++源文件(.cpp),如上图,mainwindow.cpp是主窗口类的实现文件,也是程序的入口
Froms 分组
该节点下是项目内的所有界面文件(.ui)
mainwindow.ui就是主窗口的界面文件。
界面文件是文本文件,使用XML语言描述界面的组成
运行一个QT项目
说起这个,就又得提我的傻逼行为,生成的一堆文件中,我不知道运行哪个,搁那儿乱运行一通…
强调,运行的是main.cpp文件!!!
打开,可以看到一个最最进本的QT项目,生成一个空的页面
点击运行,可以看到:
注意事项
- QT头文件没有.h后缀
- QT一个类对应一个头文件,类名就是头文件名
- QApplication应用程序类
3.1 管理图形用户界面应用程序的控制流和主要设置。
3.2 是QT的整个后台管理的命脉它包含主事件循环,在其中来自窗口系统和其他资源的所有事件处理和调度。它也处理应用程序的初始化和结束,并且提供对话管理。
3.3 对于任何一个使用QT的图形用户界面应用程序,都正好存在一个QApplication对象,而不论这个应用程序在同一时间内是不是有0,1,2或更多个窗口。 - .exec()
程序进入消息循环,等待对用户输入进行响应。这里main()把控制权转交给QT,QT完成事件处理工作,当应用程序推出的时候exec()的值就会返回。在exec()中,QT接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。
信号和槽
信号槽,就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal),这种发出是没有目的的。
如果有对象对这个信号感兴趣,就会用连接函数(connect),也就是说,将想要处理的信号和自己的一个函数(槽(slot))绑定来处理这个信号。
当信号发出时,被连接的槽函数会自动被回调。
看一个栗子:
#include<QApplication>
#include<QPushButton>
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
QPushButton button("Quit");
QObject::connect(&button,&QPushButton::clicked,&app,&QApplication::quit);
button.show();
return app.exec();
}
运行结果:
点击Quit,程序退出
connect()
函数最常用的一般形式:
connect(sender,signal,receiver,slot);
参数:
- sender: 发出信号的对象
- signal: 发送对象发出的信号
- receiver: 接收信号的对象
- slot: 接收对象在接收到信号之后所需要调用的函数
信号槽要求信号和槽的参数一致,所谓一致,是参数类型一致。如果不一致,允许的情况是,槽函数的参数可以比信号的少,即便如此,槽函数存在的那
些参数的顺序也必须和信号的前面几个一致起来。这是因为,你可以在槽函数中选择忽略信号传来的数据(也就是槽函数的参数比信号的少),但是不能说信号根本没有这个数据,你就要在槽函数中使用(就是槽函数的参数比信号的多,这是不允许的)。
自定义信号槽
connect()函数可以让我们连接系统自带的信号和槽。QT同时允许我们自己设计的信号和槽。
(就像C++一样,允许我们直接调用系统内置的库函数,但同时也允许我们自定义函数)
实现一个报纸和订阅者的栗子:
有一个报纸类Newspaper,有一个订阅者类Subscriber。Subscriber可以订阅Newspaper。
这样,当Newspaper有了新的内容的时候,Subscriber可以立即得到通知。
#include <QObject>
// newspaper.h //
class Newspaper : public QObject
{
Q_OBJECT
public:
Newspaper(const QString & name) :
m_name(name)
{
}
void send()
{
emit newPaper(m_name);
}
signals:
void newPaper(const QString &name);
private:
QString m_name;
};
/*newspaper类,继承QObject类。只有继承了QObject类的类,才具有信号槽的能力*/
首先是,newspaper类,继承QObject类。只有继承了QObject类的类,才具有信号槽的能力