信号重载后,按照原来的写法写的代码(错误的写法):
QT信号重载后,我们的槽函数如何接收这个信号?
下面的案例就是点击“发出信号”这个按钮,将发出信号,然后当前窗体就会接收这个信号并进行相对应的打印操作。
MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void myslot1(); //发出信号的槽函数
void myslot3(); //无参槽函数
void myslot2(QString string); //有参槽函数
signals:
void mysignal();
void mysignal(QString string);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QPushButton *but2 = new QPushButton(this);
but2->setText("发出信号");
but2->show();
//发出信号
connect(but2,&QPushButton::clicked,this,&MainWindow::myslot1);
//接收信号(错误写法)
connect(this,&MainWindow::mysignal,this,&MainWindow::myslot3); //无参
connect(this,&MainWindow::mysignal,this,&MainWindow::myslot2); //有参
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::myslot1()
{
emit mysignal();
emit mysignal("有参数");
}
void MainWindow::myslot3()
{
qDebug() << "无参数";
}
void MainWindow::myslot2(QString string)
{
qDebug() << string;
}
按照原来的方法肯定是不行的,因为槽函数无法知晓到底要接收哪一个信号。
解决办法
只需将MainWindow.cpp中的接收信号那一步改一下就好了。
//错误的写法
connect(this,&MainWindow::mysignal,this,&MainWindow::myslot3); //无参
connect(this,&MainWindow::mysignal,this,&MainWindow::myslot2); //有参
使用函数指针指向信号,即可。
//无参
void (MainWindow::*mysignalone)() = &MainWindow::mysignal;
connect(this,mysignalone,this,&MainWindow::myslot3);
//有参
void (MainWindow::*mysignaltwo)(QString) = &MainWindow::mysignal;
connect(this,mysignaltwo,this,&MainWindow::myslot2);
void (作用域::*函数指针名称)(参数) = &控件类名::信号名称;