因為兩個窗口互不相干,所以需要重新創建一個窗口類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,不過從另外一種角度考慮,主窗口就是老大,老大只是對下面的信號處理,而下屬子窗口不能操控老大主窗口,所以當下屬子窗口需要操作老大主窗口時,需要給老大主窗口發送消息,老大主窗口再處理發送過來的消息。全程下來下屬子窗口沒有操控老大主窗口,都是老大主窗口自己進行信號的處理