Qt 之 connect用法

网上查找资料,并实际验证可行性,列出以下列常用用法:

    //! [1]基于字符串匹配,Qt4.0
//    connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(slotShowCurrTime(bool)));


    //! [2]基于方法地址匹配,Qt5.0
//    connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::slotShowCurrTime);

    //! [3]基于方法地址匹配,c++11,static_cast
//    connect(ui->pushButton, static_cast<void(QPushButton::*)(bool)>(&QPushButton::clicked),
//            this, &MainWindow::slotShowCurrTime);

    //! [4]基于方法地址匹配,函数指针
//    void (QPushButton::*ff)(bool) = &QPushButton::clicked;
//    connect(ui->pushButton, ff, this, &MainWindow::slotShowCurrTime);

    //! [5]基于方法地址匹配,c++11,QOverload
//    connect(ui->pushButton, QOverload<bool>::of(&QPushButton::clicked), this, &MainWindow::slotShowCurrTime);

    //! [6]基于方法地址匹配,c++14,qOverload,还不太好使,不知道缺啥
//    connect(ui->pushButton, qOverload<bool>(&QPushButton::clicked), this, &MainWindow::slotShowCurrTime)

    //! [7]基于方法地址匹配,lamda表达式
//    connect(ui->pushButton, &QPushButton::clicked, [=]()
//    {
//        slotShowCurrTime(true);
//    });

//    connect(ui->pushButton, &QPushButton::clicked, [=](bool cs)
//    {
//        slotShowCurrTime(cs);
//    });

//    connect(ui->pushButton, static_cast<void(QPushButton::*)(bool)>(&QPushButton::clicked), [=](bool cs){
//        slotShowCurrTime(cs);
//    });

//    connect(ui->pushButton, QOverload<bool>::of(&QPushButton::clicked), [=](bool cs){
//        slotShowCurrTime(cs);
//    });

下面一种是传递自定义数据类型

.h文件必要代码

#include <QVariant>

//自定义结构体用作参数类型
struct myType_st{
  int aa;
};
Q_DECLARE_METATYPE(myType_st)

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
//...
signals:
    void signalPassMyType(QVariant variant);

public slots:
    void slotPassMyType(QVariant variant);
//...
}

.cpp文件必要代码

void MainWindow::slotPassMyType(QVariant variant)
{
    myType_st myType = variant.value<myType_st>();
    qDebug() << myType.aa;
}

    connect(this, &MainWindow::signalPassMyType, this, &MainWindow::slotPassMyType);

    myType_st st;
    st.aa = 45;
    QVariant variant;
    variant.setValue(st);
    emit signalPassMyType(variant);

最后,补充说明:

信号-槽可以一对多、多对一、信号A可以连接到信号B上。

一对多时响应顺序按照connect顺序执行,

emit signal后依次执行完slot才继续执行emit后面的语句。

槽函数相当于C语言的回调函数,槽可以忽略信号中多余的参数。

在使用信号、槽的类中,必须在类的定义中加入宏Q_OBJECT,

connect()是QObject类的一个静态函数,而QObject是所有Qt类的基类

转用+http://c.biancheng.net/view/1823.html

转用+https://blog.csdn.net/fuhanghang/article/details/123521690

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值