快速创建qt工程
当我们熟悉基本的从空项目创建qt应用程序后,以后我们可以直接从模板中创建一个qt工程
注意,本节暂时不使用界面文件来创建UI界面,所以将下图的单选框取消选中。
下图的向导将会自动创建一个C++类MyWidget派生自QWidget类
创建工程完毕后,如下图所示,派生出的MyWidget类也将自动创建对象,并显示
mywidget.h头文件内容
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = 0);
~MyWidget();
};
#endif // MYWIDGET_H
mywidget.cpp源码
#include "mywidget.h"
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
}
MyWidget::~MyWidget()
{
}
上述头文件和源码将作为一个自定义的窗口类使用,我们可以在窗口类的构造函数里创建其他Qt控件
上述Qt程序的执行流程
- 首先进入main函数
- QApplication a(argc, argv);
根据启动参数创建了一个Qt应用程序 - MyWidget w;
调用MyWidget类的构造函数,创建出一个对象w - w.show();
显示出这个窗口控件 - a.exec();
Qt应用程序后续将持续阻塞在该语句,内部为主线程的循环 - 当a.exec()指定完毕后,携带着程序执行结果代码,通过return返回。
直接在父控件的构造函数中创建一个按钮
在mywidget.h头文件中对MyWidget类的public中插入
QPushButton b1,*b2
在mywidget.cpp的MyWidget类构造函数中插入以下代码
b1.setParent(this);
b1.setText("我是b1对象");
b2=new QPushButton(this);
b2->setText("我是b2指针");
b2->move(100,100);
运行结果如下,
按钮点击事件
通过connect,可以建立一条“信号传输的线路”,使得某信号接收器能够接收到某Widget控件所发出的信号,也就是connect的过程。
实现按下b1后程序关闭
如上代码中,想要按下b1按钮后关闭整个程序,可以在MyWidget构造函数中插入以下代码
connect(&b1,&QPushButton::pressed,this,&MyWidget::close);
各个实参解释:
- &b1:信号发出者,是一个指针类型
- &QPushButton::pressed:
要处理的信号,一般是 &发送者的类名::信号名 - 信号接收者
- 信号处理函数(槽函数slot)
一般是 &接收者的类名::槽函数名
当b1按下时候,立马发出一个信号给this(信号接受者),然后调用信号接收者中的槽函数close方法,即Qt程序窗口将被关闭。
同理,我们还可以发送b2按钮的released信号,并让信号接受者为b2,处理函数为b2的hide成员函数,当我们点击b2并松开时,b2按钮的hide方法将被调用,即b2按钮消失。
connect(b2,&QPushButton::released,b2,&QPushButton::hide);
自定义槽函数
在Qt5中,槽函数可以使任意类的成员函数,也可以是全局普通函数,还可以是静态函数
槽函数要与信号相一致(参数,返回值)
由于信号都没有返回值,所以槽函数一定无返回值。
示例:
在头文件的类定义的public中添加void mySlot()函数,
在源文件中添加void MyWidget::mySlot()函数的定义
通过connect方法建立信号和槽之间的通信链路
connect(b2,&QPushButton::clicked,this,&MyWidget::mySlot);
多个信号和槽之间建立链路连接
#include "mywidget.h"
//#include
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
{
b1.setParent(this);
b1.setText("关闭当前窗口");
b2=new QPushButton(this);
b2->setText("改变此按钮文本");
b2->move(100,100);
connect(&b1,&QPushButton::pressed,b2,&QPushButton::hide);
connect(&b1,&QPushButton::released,this,&MyWidget::close);
connect(b2,&QPushButton::clicked,this,&MyWidget::mySlot);
}
void MyWidget::mySlot()
{
MyWidget::b2->setText("Hello");
}
MyWidget::~MyWidget()
{
}
如上代码,可以分别实现:
- 当b1按下时,b2所指向的按钮隐藏
- 当b1松开时,将关闭窗口
- 当b2点击时,将调用自定义的mySlot函数,设置b2指向的按钮的文本为"Hello"
由此可得,信号类似短信,同一条信号可以发送给多个不同的接受者,或不同信号可以发送给同一个接受者,其中connect用于建立发送信号的链路。