信號重載後,按照原來的寫法寫的代碼(錯誤的寫法):
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 (作用域::*函數指針名稱)(參數) = &控件類名::信號名稱;