在QT5中,信號有參數和無參數
#ifndef SUBWIDGET_H #define SUBWIDGET_H #include <QWidget> #include <QPushButton> class SubWidget : public QWidget { Q_OBJECT public: explicit SubWidget(QWidget *parent = 0); void sendSlot(); signals: /*信號必須有singles關鍵字來聲明 * 信號沒有返回值,但可以有參數 * 信號就是函數的生命,只需聲明,無需定義 * 使用:emit mySignal(); */ void mySignal(); void mySignal(int , QString); public slots: private: QPushButton btn4; }; #endif // SUBWIDGET_H
#include "subwidget.h" SubWidget::SubWidget(QWidget *parent) : QWidget(parent) { this->setWindowTitle("波老師"); this->setFixedSize(360,480); btn4.setParent(this); btn4.setText("切換到蒼老師"); //點擊按鈕btn4實現給主窗口發送信號 connect(&btn4,&QPushButton::clicked,this,&SubWidget::sendSlot); } void SubWidget::sendSlot() { emit mySignal(); emit mySignal(250,"我是子窗口"); }
#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 mySlot();//自定義的槽函數 void changeWin(); void dealWin(); void subSlot(int a,QString str); private: QPushButton btn1; QPushButton *btn2; QPushButton btn3; SubWidget w;//該對象在主窗口中,子窗口沒有辦法調用,所以需要利用子窗口發送給主窗口消息,進而主窗口進行處理 }; #endif // MAINWIDGET_H
#include "mainwidget.h" #include <QPushButton> #include <QDebug> MainWidget::MainWidget(QWidget *parent) : QWidget(parent) { // QPushButton btn1; // QPushButton btn2; btn1.setParent(this); btn1.setText("colse"); btn1.move(100,100); btn2 = new QPushButton(this);//指針沒有空間,是需要動態的對其進行空間的分配 btn2 ->setParent(this); btn2 ->setText(" 3 2 1 "); connect(&btn1,&QPushButton::pressed,this ,&MainWidget::close); /* 對connect的說明: * &btn1 :信號發出着,指針類型 * &QPushButton::pressed:處理信號, &發送者的類名::信號名字 * this:信號接收者 * &MainWidget::close: 槽函數,信號處理函數 &接收者的類名::槽函數名字 */ /*自定義槽,說的更加通俗一點,就是普通函數的用法 * QT5:可以是 任意的成員函數(常用這種方法,直接寫成該類的成員函數),普通全局函數,靜態函數 都可以是槽函數 * 槽函數需要和信號一致(參數,返回值) * 由於信號都是沒有返回值,所以,槽函數一定沒有返回值 */ //釋放按鈕btn2實現里面的文本內容發生改變 connect(btn2,&QPushButton::released,this,&MainWidget::mySlot);//在寫自定義信號槽函數的時候,一定要看發送信號函數的類型,這里released信號的函數是:void QAbstractButton::released() //即released函數沒有參數,也沒有返回值,槽函數需要和信號一致,也沒有參數和返回值 //釋放按鈕btn2隱藏按鈕btn1 connect(btn2,&QPushButton::released,&btn1,&QPushButton::hide); //互相切換窗口的小游戲 this->setFixedSize(360,480); this ->setWindowTitle("蒼老師"); btn3.setParent(this); btn3.setText("換到波老師"); btn3.move(50,50); //顯示子窗口 // w.show(); //點擊按鈕btn3實現主窗口隱藏,子窗口顯示 connect(&btn3,&QPushButton::released,this,&MainWidget::changeWin); //處理子窗口發送過來的信號 void (SubWidget::*funSognal)() = &SubWidget::mySignal; connect(&w,funSognal,this,&MainWidget::dealWin); //處理子窗口發送過來的信號(有參數) void (SubWidget::*testSognal)(int ,QString) = &SubWidget::mySignal; connect(&w,testSognal,this,&MainWidget::subSlot); } //自定義槽函數的實現 void MainWidget::mySlot() { btn2->setText("I LOVE YOU"); } void MainWidget::changeWin() { //子窗口顯示, w.show(); //本窗口隱藏 this ->hide(); } void MainWidget::dealWin() { //子窗口隱藏 w.hide(); //本窗口顯示 this->show(); } void MainWidget::subSlot(int a,QString str) { qDebug()<<a<<str; } MainWidget::~MainWidget() { }
當信號函數發生重載的時候,為了不產生二義性,需要使用函數指針的方式進行區分,(這里需要重點掌握指針函數的用法),同時從這種寫法來看,也不難看出其在語法上還是比較難的,在QT4中則沒用這么難,方式如下:
1)對槽函數聲明public slots:
2)其最大的優勢是當寫connect中的SIGNAL和SLOT時會自動提示信號的類型,
既然QT4在這個方面那么簡單簡潔,為什么還要用QT5那么難的語法呢(函數指針)?這是因為在QT4中 SIGNAL 和SLOT 將函數名字轉化成字符串 不進行錯誤的檢查,只在運行的時候來提示程序不可行,在大的項目中,代碼量是非常大的,我們還是盡量希望其能夠提示語法的錯誤,不希望最后運行時提示有錯誤。
