Qt信號重載

信號重載後,按照原來的寫法寫的代碼(錯誤的寫法):

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 (作用域::*函數指針名稱)(參數) = &控件類名::信號名稱;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章