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>->setText(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">切換到主窗口</span><span style="color: #800000;">"</span><span style="color: #000000;">));
bt</span>->move(QPoint(<span style="color: #800080;">50</span>, <span style="color: #800080;">50</span><span style="color: #000000;">));
connect(bt, </span>&QPushButton::clicked, <span style="color: #0000ff;">this</span>, &<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>-><span style="color: #000000;">setParent(parent);
</span><span style="color: #0000ff;">this</span>->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>->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>->setText(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">關閉窗口</span><span style="color: #800000;">"</span><span style="color: #000000;">));
bt1</span>->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: 信號發出者, 指針類型
* &QPushButton::pressed: 信號的發射 &發送者的類名::信號名字
* this: 信號接受者, 指針類型
* &MainWidget::close: 信號的處理 &接收的類名::槽名字
*
</span><span style="color: #008000;">*/</span><span style="color: #000000;">
connect(bt1, </span>&QPushButton::pressed, <span style="color: #0000ff;">this</span>, &<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>->setText(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">隱藏關閉窗口按鈕以及改變自身文本內容</span><span style="color: #800000;">"</span><span style="color: #000000;">));
bt2</span>->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>&QPushButton::released, <span style="color: #0000ff;">this</span>, &<span style="color: #000000;">MainWidget::myButtonReleasedSlot);
connect(bt2, </span>&QPushButton::released, bt1, &<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>->setText(QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">切換到子窗口</span><span style="color: #800000;">"</span><span style="color: #000000;">));
bt3</span>->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>&QPushButton::released, <span style="color: #0000ff;">this</span>, &<span style="color: #000000;">MainWidget::myChangeWin);
</span><span style="color: #0000ff;">void</span> (SubWidget::*funSignal)() = &<span style="color: #000000;">SubWidget::mySignal;
</span><span style="color: #0000ff;">void</span> (SubWidget::*funSignalParm)(<span style="color: #0000ff;">int</span>, QString) = &<span style="color: #000000;">SubWidget::mySignalParm;
</span><span style="color: #0000ff;">void</span> (MainWidget::*funSlot)() = &<span style="color: #000000;">MainWidget::myDealSub;
</span><span style="color: #0000ff;">void</span> (MainWidget::*funSlotParm)(<span style="color: #0000ff;">int</span>, QString) = &<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>->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>->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>&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;"> & : 把外部所有局部變量, 引用符號</span>
[=](<span style="color: #0000ff;">bool</span><span style="color: #000000;"> isCheck) mutable {
cout</span>++<span style="color: #000000;">;
bt4</span>->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><< 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><< QString::fromLocal8Bit(<span style="color: #800000;">"</span><span style="color: #800000;">打印參數: </span><span style="color: #800000;">"</span>).toStdString().c_str() <<<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><< <span style="color: #800000;">"</span><span style="color: #800000;">num: </span><span style="color: #800000;">"</span> << num << <span style="color: #800000;">"</span><span style="color: #800000;"> str: </span><span style="color: #800000;">"</span> <<<span style="color: #000000;"> str.toUtf8().data();
qInfo() </span><< <span style="color: #800000;">"</span><span style="color: #800000;">num: </span><span style="color: #800000;">"</span> << num << <span style="color: #800000;">"</span><span style="color: #800000;"> str: </span><span style="color: #800000;">"</span> <<<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();
}
效果現象: