同じ名前のsubwidget.hや機能ではなく、信号がパラメータを持って前に信号を宣言します。
void backSignal(QString);
()信号ものスロット機能sendSignal subwidget.cppに送信された後。
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);
同じ名前の信号がない場合には、書き込みも問題ありませんが、私たちは今の引数で、引数なしで、2つの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は、文字列の出力信号を送信する戻る]ボタンをクリックして、操作を保存します。
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("子窗口请求返回");
}