美文网首页
信号和槽(signal and slot)

信号和槽(signal and slot)

作者: zhangzq | 来源:发表于2020-07-01 11:27 被阅读0次

    快速创建qt工程

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


    image.png

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


    image.png

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


    image.png

    mywidget.h头文件内容

    #ifndef MYWIDGET_H
    #define MYWIDGET_H
    
    #include <QWidget>
    
    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 <QPushButton>
    
    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)

          本文链接:https://www.haomeiwen.com/subject/emtfqktx.html