文件列表: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(); }
效果現象:指針