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

https://www.cnblogs.com/lsgxeva/p/7808906.html
文件列表:

 

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();

</span><span style="color: #0000ff;">void</span><span style="color: #000000;"> 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 </span>= <span style="color: #0000ff;">new</span> QPushButton(<span style="color: #0000ff;">this</span><span style="color: #000000;">);
bt</span>-&gt;setText(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">切換到主窗口</span><span style="color: #800000;">"</span><span style="color: #000000;">));
bt</span>-&gt;move(QPoint(<span style="color: #800080;">50</span>, <span style="color: #800080;">50</span><span style="color: #000000;">));

connect(bt, </span>&amp;QPushButton::clicked, <span style="color: #0000ff;">this</span>, &amp;<span style="color: #000000;">SubWidget::sendSlot);

}

SubWidget::~SubWidget()
{
}

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

複製代碼

 

 

mainwidget.h

複製代碼
#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 </span>*<span style="color: #000000;"> bt1;
QPushButton </span>*<span style="color: #000000;"> bt2;
QPushButton </span>*<span style="color: #000000;"> bt3;

SubWidget </span>*<span style="color: #000000;"> sw;

};

#endif // MAINWIDGET_H

複製代碼

 

mainwidget.cpp

複製代碼
#include "mainwidget.h"
MainWidget::MainWidget(QWidget *parent)
QWidget(parent)
{
ui.setupUi(this);
</span><span style="color: #0000ff;">this</span>-&gt;<span style="color: #000000;">setParent(parent);
</span><span style="color: #0000ff;">this</span>-&gt;setWindowTitle(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">老大</span><span style="color: #800000;">"</span><span style="color: #000000;">));
</span><span style="color: #0000ff;">this</span>-&gt;resize(QSize(<span style="color: #800080;">500</span>, <span style="color: #800080;">500</span><span style="color: #000000;">));

bt1 </span>= <span style="color: #0000ff;">new</span> QPushButton(<span style="color: #0000ff;">this</span><span style="color: #000000;">);
bt1</span>-&gt;setText(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">關閉窗口</span><span style="color: #800000;">"</span><span style="color: #000000;">));
bt1</span>-&gt;move(QPoint(<span style="color: #800080;">50</span>, <span style="color: #800080;">50</span><span style="color: #000000;">));

</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
 * bt1: 信號發出者, 指針類型
 * &amp;QPushButton::pressed: 信號的發射  &amp;發送者的類名::信號名字
 * this: 信號接受者, 指針類型
 * &amp;MainWidget::close: 信號的處理  &amp;接收的類名::槽名字
 *
 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
connect(bt1, </span>&amp;QPushButton::pressed, <span style="color: #0000ff;">this</span>, &amp;<span style="color: #000000;">MainWidget::close);

bt2 </span>= <span style="color: #0000ff;">new</span> QPushButton(<span style="color: #0000ff;">this</span><span style="color: #000000;">);
bt2</span>-&gt;setText(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">隱藏關閉窗口按鈕以及改變自身文本內容</span><span style="color: #800000;">"</span><span style="color: #000000;">));
bt2</span>-&gt;move(QPoint(<span style="color: #800080;">100</span>, <span style="color: #800080;">100</span><span style="color: #000000;">));

</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
 * Qt5: 槽和普通的C++成員函數幾乎是一樣的
 * 可以是虛函數,可以被重載,可以是public slots、protected slots、private slots,可以被其他C++成員函數直接調用
 * 唯一不同的是:槽還可以和信號連接在一起,在這種情況下,信號被髮射時,會自動調用這個槽
 * 槽不需要信號傳過來的參數時,可以不要參數;但槽函數一旦要參數,其參數個數,類型,順序必須要和對應的信號保持一致。另外,槽函數的參數不能有缺省值。
 * 由於信號的返回值爲void, 槽必須和信號的返回值保持一致, 因此槽的返回值爲void
 *
 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
connect(bt2, </span>&amp;QPushButton::released, <span style="color: #0000ff;">this</span>, &amp;<span style="color: #000000;">MainWidget::myButtonReleasedSlot);
connect(bt2, </span>&amp;QPushButton::released, bt1, &amp;<span style="color: #000000;">QPushButton::hide);

bt3 </span>= <span style="color: #0000ff;">new</span> QPushButton(<span style="color: #0000ff;">this</span><span style="color: #000000;">);
bt3</span>-&gt;setText(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">切換到子窗口</span><span style="color: #800000;">"</span><span style="color: #000000;">));
bt3</span>-&gt;move(QPoint(<span style="color: #800080;">150</span>, <span style="color: #800080;">150</span><span style="color: #000000;">));

sw </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> SubWidget();
connect(bt3, </span>&amp;QPushButton::released, <span style="color: #0000ff;">this</span>, &amp;<span style="color: #000000;">MainWidget::myChangeWin);

</span><span style="color: #0000ff;">void</span> (SubWidget::*funSignal)() = &amp;<span style="color: #000000;">SubWidget::mySignal;
</span><span style="color: #0000ff;">void</span> (SubWidget::*funSignalParm)(<span style="color: #0000ff;">int</span>, QString) = &amp;<span style="color: #000000;">SubWidget::mySignalParm;
</span><span style="color: #0000ff;">void</span> (MainWidget::*funSlot)() = &amp;<span style="color: #000000;">MainWidget::myDealSub;
</span><span style="color: #0000ff;">void</span> (MainWidget::*funSlotParm)(<span style="color: #0000ff;">int</span>, QString) = &amp;<span style="color: #000000;">MainWidget::myDealSubParm;
connect(sw, funSignal, </span><span style="color: #0000ff;">this</span><span style="color: #000000;">, funSlot);
connect(sw, funSignalParm, </span><span style="color: #0000ff;">this</span><span style="color: #000000;">, funSlotParm);

</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
 * Lambda 表達式, 匿名函數對象
 * C++11 新增加的特性, 編譯時需要添加參數C++11
 * Qt配合信號一起使用, 非常方便
 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
QPushButton </span>*bt4 = <span style="color: #0000ff;">new</span> QPushButton(<span style="color: #0000ff;">this</span><span style="color: #000000;">);
bt4</span>-&gt;setText(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">Lambda表達式並統計次數</span><span style="color: #800000;">"</span><span style="color: #000000;">));
bt4</span>-&gt;move(QPoint(<span style="color: #800080;">200</span>, <span style="color: #800080;">200</span><span style="color: #000000;">));
</span><span style="color: #0000ff;">int</span> cout = <span style="color: #800080;">0</span><span style="color: #000000;">;
connect(bt4, </span>&amp;QPushButton::clicked, <span style="color: #0000ff;">this</span><span style="color: #000000;">,
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> = : 把外部所有局部變量、類中所有成員以值傳遞方式
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> this : 類中所有成員以值傳遞方式
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> &amp; : 把外部所有局部變量, 引用符號</span>
    [=](<span style="color: #0000ff;">bool</span><span style="color: #000000;"> isCheck) mutable {
        cout</span>++<span style="color: #000000;">;
        bt4</span>-&gt;setText(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">點擊次數: </span><span style="color: #800000;">"</span>) +<span style="color: #000000;"> QString::number(cout));
        qDebug() </span>&lt;&lt; QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">這是一個Lambda表達式測試輸出</span><span style="color: #800000;">"</span><span style="color: #000000;">).toStdString().c_str();
        qDebug() </span>&lt;&lt; QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">打印參數: </span><span style="color: #800000;">"</span>).toStdString().c_str() &lt;&lt;<span style="color: #000000;"> 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() </span>&lt;&lt; <span style="color: #800000;">"</span><span style="color: #800000;">num: </span><span style="color: #800000;">"</span> &lt;&lt; num &lt;&lt; <span style="color: #800000;">"</span><span style="color: #800000;"> str: </span><span style="color: #800000;">"</span> &lt;&lt;<span style="color: #000000;"> str.toUtf8().data();
qInfo() </span>&lt;&lt; <span style="color: #800000;">"</span><span style="color: #800000;">num: </span><span style="color: #800000;">"</span> &lt;&lt; num &lt;&lt; <span style="color: #800000;">"</span><span style="color: #800000;"> str: </span><span style="color: #800000;">"</span> &lt;&lt;<span style="color: #000000;"> str.toUtf8().data();
</span><span style="color: #008000;">//</span><span style="color: #008000;">qFatal(str.toUtf8().data());</span>

}

複製代碼

 

main.cpp

複製代碼
#include "mainwidget.h"
#include <QtWidgets/QApplication>

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

複製代碼

 

效果現象:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章