深入理解QT的SIGNAL\SLOT机制(一):SIGNAL\SLOT如何使用

来源:互联网 发布:欧洲卡车模拟2 mac 编辑:程序博客网 时间:2024/05/16 00:34

首先声明不同版本的QT针对信号和槽的实现略有不同,接口大多一样。我用的是QT5.9.1。

QT的SIGNAL/SLOT有点像观察者模式,说是阶段一直做SDN,在controller的代码中就是使用观察者模式进行消息分发,看了Qt的SIGNAL/SLOT才发现这也是一种观察者模式。

第一章先来看SIGNAL/SLOT如何简单实用

新建工程,该工程里面就两个类,一个是MyWidget,继承自QWidget,一个是Test,继承自QObject。
这里写图片描述

MyWiget.h:我们在MyWidget中添加一个信号:mysignal

#ifndef MYWIDGET_H#define MYWIDGET_H#include <QWidget>namespace Ui {class MyWidget;}class MyWidget : public QWidget{    Q_OBJECTpublic:    explicit MyWidget(QWidget *parent = 0);~MyWidget();signals:    void mysignal();private:    Ui::MyWidget *ui;};
#endif // MYWIDGET_HMyWidget.cpp:#include "mywidget.h"#include "ui_mywidget.h"#include"test.h"MyWidget::MyWidget(QWidget *parent) :    QWidget(parent),    ui(new Ui::MyWidget){    ui->setupUi(this);    Test test;    connect(this,SIGNAL(mysignal()),&test,SLOT(mySlot()));    emit mysignal();}MyWidget::~MyWidget(){    delete ui;}

我们在MyWidget的构造函数中创建了一个Test对象test,并调用QObject::connect()方法将MyWidget::mysignal信号和Test::myslot槽绑定起来。然后发射该信号。

接下里看Test.h

#ifndef TEST_H#define TEST_H#include <QObject>class Test : public QObject{    Q_OBJECTpublic:    explicit Test(QObject *parent = nullptr);    void func1(int);    void func2(int);signals:public slots:    void mySlot();};#endif // TEST_H

在Test类中添加两个函数func1和func2,和一个槽函数:myslot。

Test.cpp:

#include "test.h"#include<QDebug>Test::Test(QObject *parent) : QObject(parent){}void Test::func1(int){}void Test::func2(int){}void Test::mySlot(){    qDebug()<<"myslot called!";}

运行结果:
这里写图片描述