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 (作用域::*函数指针名称)(参数) = &控件类名::信号名称;

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