1. 程式人生 > >Qt5學習筆記 | 信號槽

Qt5學習筆記 | 信號槽

object net https qt 5 span BE main.c style CA

在 Qt 5 中,QObject::connect()有五個重載:

QMetaObject::Connection connect(const QObject *, const char *,
                                const QObject *, const char *,
                                Qt::ConnectionType);
 
QMetaObject::Connection connect(const QObject *, const QMetaMethod &,
                                const QObject *, const QMetaMethod &,
                                Qt::ConnectionType);
 
QMetaObject::Connection connect(const QObject *, const char *,
                                const char *,
                                Qt::ConnectionType) const;
 
QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
                                const QObject *, PointerToMemberFunction,
                                Qt::ConnectionType)
 
QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,
                                Functor);

最常用的一般形式:

1 connect(sender,   signal,   receiver,   slot);

sender:發出信號的對象,類型為QObject*

signal:發出的信號,類型為const char*

receiver:接收信號的對象,類型為QObject*

slot:接收信號後調用的函數(槽函數),類型為const char*

註意:槽函數的參數類型要和信號的一致,參數數量小於等於信號數量。

自定義槽函數:

 1 #include <QObject>
 2  
 3 ////////// newspaper.h
 4 class Newspaper : public
QObject 5 { 6 Q_OBJECT 7 public: 8 Newspaper(const QString & name) : 9 m_name(name) 10 { 11 } 12 13 void send() 14 { 15 emit newPaper(m_name); 16 } 17 18 signals: 19 void newPaper(const QString &name); 20 21 private: 22 QString m_name;
23 }; 24 25 ////////// reader.h 26 #include <QObject> 27 #include <QDebug> 28 29 class Reader : public QObject 30 { 31 Q_OBJECT 32 public: 33 Reader() {} 34 35 void receiveNewspaper(const QString & name) 36 { 37 qDebug() << "Receives Newspaper: " << name; 38 } 39 }; 40 41 ////////// main.cpp 42 #include <QCoreApplication> 43 44 #include "newspaper.h" 45 #include "reader.h" 46 47 int main(int argc, char *argv[]) 48 { 49 QCoreApplication app(argc, argv); 50 51 Newspaper newspaper("Newspaper A"); 52 Reader reader; 53 QObject::connect(&newspaper, &Newspaper::newPaper, 54 &reader, &Reader::receiveNewspaper); 55 newspaper.send(); 56 57 return app.exec(); 58 }

要使用槽函數功能,自定義的類必須要繼承QObject類,並在第一行代碼上寫上Q_OBJECT(無論是否使用信號槽,凡是QObject的子類都應該寫上)。

Newspaper類有個signals代碼塊,它裏面的就是該類的信號。信號是一個個函數名,返回值是void,不需要添加任何實現。

send()函數,只有一個語句emit newPaper(m_name); 。emit意思是發出信號,此處為發出newPaper信號,參數為m_name。

在main函數中,使用QObject::connect()來連接信號和槽。

原文:

https://www.devbean.net/2012/08/qt-study-road-2-signal-slot/

https://www.devbean.net/2012/08/qt-study-road-2-custom-signal-slot/

Qt5學習筆記 | 信號槽