在subwidget.h中聲明一個signal. 和之前的信號函數重名但是有參數:
void backSignal(QString);
之后在subwidget.cpp的槽函數sendSignal()中也發送該信號:
emit backSignal("子窗口請求返回");
在mainwidget.h中聲明一個槽函數來響應該信號:
void logSlot(QString);
並在mainwidget.cpp中定義該槽函數, 打印信號傳過來的字符串:
void MainWidget::logSlot(QString log)
{
qDebug() << log;
}
因為使用到了qDebug, 所以需要在mainwidget.h中添加頭文件:
#include <QDebug>
下面在mainwidget.cpp中建立連接即可:
connect(&subWin, backSignal, this, &MainWidget::logSlot);
如果沒有重名信號的話, 這樣寫是沒有問題的, 但是我們現在由兩個backSignal信號, 一個不帶參數, 一個帶參數, 編譯器是沒辦法區分的, 需要我們告訴它, 所以, 刪掉那兩條信號都是backSignal的connect語句重新建立連接:
void(SubWidget::*backSignal)() = &SubWidget::backSignal; // 我是沒有參數的backSignal, 叫backSignal1
connect(&subWin, backSignal, this, &MainWidget::backSlot);
void(SubWidget::*backSigna2)(QString) = &SubWidget::backSignal; // 我是帶一個QString參數的backSignal, 叫backSignal2
connect(&subWin, backSigna2, this, &MainWidget::logSlot);
保存后 Ctrl + R運行, 點擊Back按鈕, 會輸出信號發送的字符串:
如果用Qt4的語法的話, 會十分簡單:
connect(&subWin, SIGNAL(backSignal()), this, SLOT(backSlot()));
connect(&subWin, SIGNAL(backSignal(QString)), this, SLOT(logSlot(QString)));
但是Qt4這種寫法在編譯時是不進行錯誤, 也就是如果你信號和槽函數名字寫錯了, 也是可以編譯通過的. 在運行時才會報錯. 而Qt5新寫法在編譯時就會報錯, 所以Qt4更簡單Qt5會更安全.
附錄
mainwidget.h
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include <QPushButton>
#include "subwidget.h"
#include <QDebug>
class MainWidget : public QWidget
{
Q_OBJECT
public:
MainWidget(QWidget *parent = 0);
~MainWidget();
public slots:
void nextSlot();
void backSlot();
void logSlot(QString);
private:
QPushButton b1;
QPushButton *b2;
SubWidget subWin;
};
#endif // MAINWIDGET_H
mainwidget.cpp
#include "mainwidget.h"
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
this->setWindowTitle("Window1");
this->resize(300, 200);
b1.setParent(this);
b1.setText("Close");
b1.move(50, 50);
b2 = new QPushButton(this);
b2->setText("Next");
b2->move(150, 50);
connect(&b1, &QPushButton::clicked, this, &MainWidget::close);
connect(b2, &QPushButton::clicked, this, &MainWidget::nextSlot);
void(SubWidget::*backSignal)() = &SubWidget::backSignal;
connect(&subWin, backSignal, this, &MainWidget::backSlot);
void(SubWidget::*backSigna2)(QString) = &SubWidget::backSignal;
connect(&subWin, backSigna2, this, &MainWidget::logSlot);
/*
connect(&subWin, SIGNAL(backSignal()), this, SLOT(backSlot()));
connect(&subWin, SIGNAL(backSignal(QString)), this, SLOT(logSlot(QString)));
*/
}
void MainWidget::nextSlot()
{
subWin.show();
this->hide();
}
void MainWidget::backSlot()
{
subWin.hide();
this->show();
}
void MainWidget::logSlot(QString log)
{
qDebug() << log;
}
MainWidget::~MainWidget()
{
}
subwidget.h
#ifndef SUBWIDGET_H
#define SUBWIDGET_H
#include <QWidget>
#include <QPushButton>
class SubWidget : public QWidget
{
Q_OBJECT
public:
explicit SubWidget(QWidget *parent = nullptr);
signals:
void backSignal();
void backSignal(QString);
public slots:
void sendSignal();
private:
QPushButton b;
};
#endif // SUBWIDGET_H
subwidget.cpp
#include "subwidget.h"
SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
this->setWindowTitle("Windows2");
this->resize(300, 200);
b.setParent(this);
b.setText("Back");
b.move(150, 50);
connect(&b, &QPushButton::clicked, this, &SubWidget::sendSignal);
}
void SubWidget::sendSignal()
{
emit backSignal();
emit backSignal("子窗口請求返回");
}
此文原創禁止轉載,轉載文章請聯系博主並注明來源和出處,謝謝!
作者: Raina_RLN https://www.cnblogs.com/raina/