QT 主窗口和子窗口相互切換示例

QT 主窗口和子窗口相互切換示例

文件列表:ide

 

SubWidget.h函數

#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QtWidgets/QWidget>
#include <QtWidgets/QPushButton>

class SubWidget : public QWidget
{
    Q_OBJECT

public:
    explicit SubWidget(QWidget *parent = 0);
    ~SubWidget();

    void sendSlot();

signals:
    /**
     * 信號必需要signals關鍵字來聲明
     * 信號沒有返回值, 但能夠有參數
     * 信號就是函數的聲明, 無需定義
     * 使用: emit mySignal();
     * 信號能夠被重載
     */
    void mySignal();
    void mySignalParm(int, QString);

public slots:

private:
    QPushButton * bt;
};


#endif // SUBWIDGET_H

 

 

SubWidget.cpp測試

#include "SubWidget.h"


SubWidget::SubWidget(QWidget *parent)
    : QWidget(parent)
{
    this->setParent(parent);
    this->setWindowTitle(QString::fromLocal8Bit("小弟"));
    this->resize(QSize(500, 500));

    bt = new QPushButton(this);
    bt->setText(QString::fromLocal8Bit("切換到主窗口"));
    bt->move(QPoint(50, 50));

    connect(bt, &QPushButton::clicked, this, &SubWidget::sendSlot);
}


SubWidget::~SubWidget()
{
}

void SubWidget::sendSlot()
{
    emit mySignal();
    emit mySignalParm(300, QString::fromLocal8Bit("已經切換到主窗口"));
}

 

 

mainwidget.hui

#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QtWidgets/QWidget>
#include <QtWidgets/QPushButton>
#include <QtCore/QDebug>

#include "ui_mainwidget.h"

#include "SubWidget.h"

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    explicit MainWidget(QWidget *parent = 0);
    ~MainWidget();

signals:

public slots:
    void myButtonReleasedSlot();
    void myChangeWin();
    void myDealSub();
    void myDealSubParm(int, QString);

private:
    Ui::MainWidgetClass ui;
    
    QPushButton * bt1;
    QPushButton * bt2;
    QPushButton * bt3;

    SubWidget * sw;
};

#endif // MAINWIDGET_H

 

mainwidget.cppthis

#include "mainwidget.h"

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

    this->setParent(parent);
    this->setWindowTitle(QString::fromLocal8Bit("老大"));
    this->resize(QSize(500, 500));

    bt1 = new QPushButton(this);
    bt1->setText(QString::fromLocal8Bit("關閉窗口"));
    bt1->move(QPoint(50, 50));

    /**
     * bt1: 信號發出者, 指針類型
     * &QPushButton::pressed: 信號的發射  &發送者的類名::信號名字
     * this: 信號接受者, 指針類型
     * &MainWidget::close: 信號的處理  &接收的類名::槽名字
     *
     */
    connect(bt1, &QPushButton::pressed, this, &MainWidget::close);

    bt2 = new QPushButton(this);
    bt2->setText(QString::fromLocal8Bit("隱藏關閉窗口按鈕以及改變自身文本內容"));
    bt2->move(QPoint(100, 100));

    /**
     * Qt5: 槽和普通的C++成員函數幾乎是同樣的
     * 能夠是虛函數,能夠被重載,能夠是public slots、protected slots、private slots,能夠被其餘C++成員函數直接調用
     * 惟一不一樣的是:槽還能夠和信號鏈接在一塊兒,在這種狀況下,信號被髮射時,會自動調用這個槽
     * 槽不須要信號傳過來的參數時,能夠不要參數;但槽函數一旦要參數,其參數個數,類型,順序必需要和對應的信號保持一致。另外,槽函數的參數不能有缺省值。
     * 因爲信號的返回值爲void, 槽必須和信號的返回值保持一致, 所以槽的返回值爲void
     *
     */
    connect(bt2, &QPushButton::released, this, &MainWidget::myButtonReleasedSlot);
    connect(bt2, &QPushButton::released, bt1, &QPushButton::hide);

    bt3 = new QPushButton(this);
    bt3->setText(QString::fromLocal8Bit("切換到子窗口"));
    bt3->move(QPoint(150, 150));

    sw = new SubWidget();
    connect(bt3, &QPushButton::released, this, &MainWidget::myChangeWin);

    void (SubWidget::*funSignal)() = &SubWidget::mySignal;
    void (SubWidget::*funSignalParm)(int, QString) = &SubWidget::mySignalParm;
    void (MainWidget::*funSlot)() = &MainWidget::myDealSub;
    void (MainWidget::*funSlotParm)(int, QString) = &MainWidget::myDealSubParm;
    connect(sw, funSignal, this, funSlot);
    connect(sw, funSignalParm, this, funSlotParm);

    /**
     * Lambda 表達式, 匿名函數對象
     * C++11 新增長的特性, 編譯時須要添加參數C++11
     * Qt配合信號一塊兒使用, 很是方便
     */
    QPushButton *bt4 = new QPushButton(this);
    bt4->setText(QString::fromLocal8Bit("Lambda表達式並統計次數"));
    bt4->move(QPoint(200, 200));
    int cout = 0;
    connect(bt4, &QPushButton::clicked, this,
        // = : 把外部全部局部變量、類中全部成員以值傳遞方式
        // this : 類中全部成員以值傳遞方式
        // & : 把外部全部局部變量, 引用符號
        [=](bool isCheck) mutable {
            cout++;
            bt4->setText(QString::fromLocal8Bit("點擊次數: ") + QString::number(cout));
            qDebug() << QString::fromLocal8Bit("這是一個Lambda表達式測試輸出").toStdString().c_str();
            qDebug() << QString::fromLocal8Bit("打印參數: ").toStdString().c_str() << isCheck;
        });
}

MainWidget::~MainWidget()
{
    // 直接或間接繼承於QObject的對象, 在釋放的內存的時候, 會自動調用析構函數, 釋放子對象的內存
    // 故QPushButton bt1 bt2 bt3 bt4 會隨着QWidget MainWidget的釋放而自動調用子對象的析構函數, 釋放子對象的內存
}

void MainWidget::myButtonReleasedSlot()
{
    if (bt2 != nullptr)
    {
        bt2->setText(QString::fromLocal8Bit("發送信號, 槽處理完成 ..."));
    }
}

void MainWidget::myChangeWin()
{
    this->hide();
    sw->show();
}

void MainWidget::myDealSub()
{
    this->show();
    sw->hide();
}

void MainWidget::myDealSubParm(int num, QString str)
{
    qDebug() << "num: " << num << " str: " << str.toUtf8().data();
    qDebug() << "num: " << num << " str: " << str.toStdString().c_str();

    qWarning() << "num: " << num << " str: " << str.toUtf8().data();
    qInfo() << "num: " << num << " str: " << str.toUtf8().data();
    //qFatal(str.toUtf8().data());
}

 

main.cppspa

#include "mainwidget.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWidget w; // 執行MainWidget的構造函數
    w.show();
    return a.exec();
}

 

效果現象:指針

相關文章
相關標籤/搜索