案列:ide
1.點擊button1改變button2的內容函數
2.點擊主窗口按鈕,顯示子窗口,再經過自定義信號與槽,點擊子窗口,回到主窗口this
3.重載的信號槽spa
4.拓展:3d
1.信號能夠鏈接信號指針
2.一個信號能夠鏈接多個槽函數code
3.多個信號能夠鏈接一個槽函數對象
4.槽函數能夠使用lambda表達式blog
mianwidget.cppci
#include "mainwidget.h" #include <QDebug> MainWidget::MainWidget(QWidget *parent) : QWidget(parent) { // init b1 = new QPushButton("老大", this); b1->move(100, 100); b2 = new QPushButton; b2->setParent(this); b2->setText("老二"); b2->move(200, 200); // b1 close window // qt 信號和槽他們都是函數 // 1. 信號只有函數聲明, 不須要函數定義 // 2. 槽函數據須要聲明也須要定義, 回調函數 // connect(b1, &QPushButton::pressed, this, &MainWidget::close); // 自定義槽函數 /* * 1. 槽函數在Qt5 能夠是任意類成員函數, 全局函數, 靜態函數, lambda表達式(隱式函數) * 2. 槽函數須要與信號對相應(返回值, 參數) * 3. 信號沒有返回值, 槽函數返回值: void * 4. void mysig(int, double, QString); * void myslot(int, double); * 5. 槽函數的參數是爲了接受信號傳過來的的數據 * 6. 槽函數的參數應該是不可以大於信號的參數個數, 能夠少於信號的參數個數 * 7. 槽函數能夠重載 */ connect(b1, &QPushButton::released, this, &MainWidget::slotForMianWidget); // b3 顯示子窗口SubWidget -- subW b3 = new QPushButton("軟件園", this); b3->resize(100, 50); b3->move(200, 200); connect(b3, &QPushButton::clicked, this, &MainWidget::slotHideMe); // Qt 5 信號槽的使用方法 void (SubWidget::*MySigSub)() = &SubWidget::sigSub;// 用函數指針來指定接收的信號是帶參數仍是不帶參數 connect(&subW, MySigSub, this, &MainWidget::slotShowMe); void (SubWidget::*MysigPlus)(int, QString) = &SubWidget::sigSub;// 用於信號函數發生重載的時候,告訴編譯器調用哪一個函數 connect(&subW, MysigPlus, this, &MainWidget::slotSubMsg); // Q4 信號槽 // SIGNAL() SLOT() 宏 將函數轉換爲字符串 宏展開預處理的時候不會報錯 // connect(&subW, SIGNAL(sigSub()), this, SLOT(slotShowMe())); // connect(&subW, SIGNAL(sigSub(int , QString)), this, SLOT(ABCDe(bb, aa))); // 使用lambda表達式做爲槽函數 connect(b1, &QPushButton::clicked, this, [=]() { b2->setText("lambda表達式!!!"); b3->hide(); }); } MainWidget::~MainWidget() { } void MainWidget::slotForMianWidget() { b2->setText("我被老大更名了..."); } void MainWidget::slotHideMe() { // 隱藏本身 hide(); // 顯示軟件園窗口 subW.show(); } void MainWidget::slotShowMe() { // 顯示本身 show(); // 隱藏軟件園窗口 subW.hide(); } void MainWidget::slotSubMsg(int num, QString str) { // QString --> char* // string --> char* .data() qDebug() << num << str.toUtf8().data(); }
#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 slotForMianWidget(); void slotHideMe(); void slotShowMe(); void slotSubMsg(int num, QString str); private: QPushButton* b1; QPushButton* b2; QPushButton* b3; // 顯示子窗口 // 子窗口對象 SubWidget subW; }; #endif // MAINWIDGET_H
#include "subwidget.h" SubWidget::SubWidget(QWidget *parent) : QWidget(parent) { b1= new QPushButton("中騰", this); b1->resize(100, 100); setWindowTitle("軟件園窗口"); resize(400, 600); connect(b1, &QPushButton::clicked, this, &SubWidget::myslot); } void SubWidget::myslot() { // 發送信號 emit sigSub(); emit sigSub(250, "你是二百五!!!"); }
subwidget.h
#ifndef SUBWIDGET_H #define SUBWIDGET_H #include <QWidget> #include <QPushButton> class SubWidget : public QWidget { Q_OBJECT public: explicit SubWidget(QWidget *parent = 0); signals: // 自定義信號, 必須使用signals 聲明 void sigSub(); void sigSub(int , QString); /* * 1. 能夠有參數 * 2. 能夠重載 * 3. 返回值爲void * 4. 發送信號: emit + 信號名; * emit sigsub(); */ public slots: void myslot(); private: QPushButton* b1; }; #endif // SUBWIDGET_H