Qt5学习笔记 | 信号槽

在 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()来连接信号和槽。

猜你喜欢

转载自www.cnblogs.com/fategrandorder/p/9095231.html