qt 重载信号,使用“&“方式进行connect()调用解决方案
  yQAl4kecrO8W 2023年12月23日 116 0


问题

在Qt中,重载的信号默认是无法使用&这种方式调用的。
因为&只能绑定到一个具体的信号,而重载的信号名称相同,编译器无法确定要绑定哪一个信号。

解决方案

如果非要使用&绑定重载的信号,可以使用函数指针进行转换,指定参数类型和个数,例如:

signals:
    void sendMsg(int n);
    void sendMsg(QString str);

    connect(this, static_cast<void (MainWindow::*)(const int)>(&MainWindow::sendMsg), this, [=](int n){
        qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << "n :" << n;
    });

    connect(this, static_cast<void (MainWindow::*)(const QString)>(&MainWindow::sendMsg), this, [=](QString str){
        qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << "str :" << str;
    });

示例

.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

signals:
    void sendMsg(int n);
    void sendMsg(QString str);


private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(this, static_cast<void (MainWindow::*)(const int)>(&MainWindow::sendMsg), this, [=](int n){
        qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << "n :" << n;
    });

    connect(this, static_cast<void (MainWindow::*)(const QString)>(&MainWindow::sendMsg), this, [=](QString str){
        qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << "str :" << str;
    });

    emit sendMsg(1);
    emit sendMsg("helloworld");
}

MainWindow::~MainWindow()
{
    delete ui;
}

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

结果

qt 重载信号,使用“&“方式进行connect()调用解决方案_解决方案


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月23日 0

暂无评论

推荐阅读
yQAl4kecrO8W