在 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/
原文:https://www.cnblogs.com/fategrandorder/p/9095231.html