信号和槽(signal and slot)

快速创建qt工程

当我们熟悉基本的从空项目创建qt应用程序后,以后我们可以直接从模板中创建一个qt工程


image.png

注意,本节暂时不使用界面文件来创建UI界面,所以将下图的单选框取消选中。
下图的向导将会自动创建一个C++类MyWidget派生自QWidget类


image.png

创建工程完毕后,如下图所示,派生出的MyWidget类也将自动创建对象,并显示


image.png

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程序的执行流程

  1. 首先进入main函数
  2. QApplication a(argc, argv);
    根据启动参数创建了一个Qt应用程序
  3. MyWidget w;
    调用MyWidget类的构造函数,创建出一个对象w
  4. w.show();
    显示出这个窗口控件
  5. a.exec();
    Qt应用程序后续将持续阻塞在该语句,内部为主线程的循环
  6. 当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);

运行结果如下,


image.png

按钮点击事件

通过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用于建立发送信号的链路。

你可能感兴趣的:(信号和槽(signal and slot))