因為兩個窗口互不相干,所以需要重新創建一個窗口類subWidget
subWidget.cpp文件
#ifndef SUBWIDGET_H
#define SUBWIDGET_H
#include <QWidget>
#include <QPushButton>
class SubWidget : public QWidget
{
Q_OBJECT
public:
explicit SubWidget(QWidget *parent = 0);
void sendSlot();
signals:
/*信號必須有singles關鍵字來聲明
* 信號沒有返回值,但可以有參數
* 信號就是函數的生命,只需聲明,無需定義
* 使用:emit mySignal();
*/
void mySignal();
public slots:
private:
QPushButton btn4;
};
#endif // SUBWIDGET_H
#include "subwidget.h"
SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
this->setWindowTitle("波老師");
this->setFixedSize(360,480);
btn4.setParent(this);
btn4.setText("切換到蒼老師");
//點擊按鈕btn4實現給主窗口發送信號
connect(&btn4,&QPushButton::clicked,this,&SubWidget::sendSlot);
}
void SubWidget::sendSlot()
{
emit mySignal();
}
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include <QPushButton>
#include "subwidget.h"//自子窗口頭文件
class MainWidget : public QWidget
{
Q_OBJECT
public:
MainWidget(QWidget *parent = 0);
~MainWidget();
void mySlot();//自定義的槽函數
void changeWin();
void dealWin();
private:
QPushButton btn3;
SubWidget w;//該對象在主窗口中,子窗口沒有辦法調用,所以需要利用子窗口發送給主窗口消息,進而主窗口進行處理
};
#endif // MAINWIDGET_H
#include "mainwidget.h"
#include <QPushButton>
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
//互相切換窗口的小游戲
this->setFixedSize(360,480);
this ->setWindowTitle("蒼老師");
btn3.setParent(this);
btn3.setText("換到波老師");
btn3.move(50,50);
//顯示子窗口
// w.show();
//點擊按鈕btn3實現主窗口隱藏,子窗口顯示
connect(&btn3,&QPushButton::released,this,&MainWidget::changeWin);
//處理子窗口發送過來的信號
connect(&w,&SubWidget::mySignal,this,&MainWidget::dealWin);
}
//自定義槽函數的實現
void MainWidget::changeWin()
{
//子窗口顯示,
w.show();
//本窗口隱藏
this ->hide();
}
void MainWidget::dealWin()
{
//子窗口隱藏
w.hide();
//本窗口顯示
this->show();
}
MainWidget::~MainWidget()
{
}
利用emit 來進行子窗口信號的傳遞,進而在主窗口中進行信號處理(即子窗口發送一個消息給主窗口,剩下的就交給主窗口進行處理)
之所以用兩個connect來實現這個功能,這是因為在子窗口中不能調用主窗口中創建的對象w,不過從另外一種角度考慮,主窗口就是老大,老大只是對下面的信號處理,而下屬子窗口不能操控老大主窗口,所以當下屬子窗口需要操作老大主窗口時,需要給老大主窗口發送消息,老大主窗口再處理發送過來的消息。全程下來下屬子窗口沒有操控老大主窗口,都是老大主窗口自己進行信號的處理
