使用 connect()可以让我们连接系统提供的信号和槽。但是, Qt 的信号槽机制
并不仅仅是使用系统提供的那部分,还会允许我们自己设计自己的信号和槽。
下面我们使用 Qt 的信号槽,实现一个书籍和阅读者的例子:
newpaper.h(信号)
#ifndef NEWPAPER_H
#define NEWPAPER_H
#include <QObject>
class newpaper : public QObject
{
Q_OBJECT
public:
explicit newpaper(QObject *parent = nullptr);
newpaper(const QString &book,const int &num):m_book(book),m_num(num){}
void point()
{
emit sendpaper(m_book);
emit sendpaper(m_num);
}
signals:
void sendpaper(const QString &name);
void sendpaper(const int &num);
private:
QString m_book;
int m_num;
};
#endif // NEWPAPER_H
reader.h(槽)
#ifndef READER_H
#define READER_H
#include <QObject>
#include <QDebug>
class reader : public QObject
{
Q_OBJECT
public:
explicit reader(QObject *parent = nullptr);
void recievenew(const QString &name)
{
qDebug() << "newbook =" << name;
}
void recievenew(const int &num)
{
qDebug() << "num =" << num;
}
signals:
};
#endif // READER_H
然后调用
void (newpaper::*tpr1)(const QString&) = &newpaper::sendpaper;
void (reader::*tpr2)(const QString&) = &reader::recievenew;
void (newpaper::*tpr3)(const int&) = &newpaper::sendpaper;
void (reader::*tpr4)(const int&) = &reader::recievenew;
connect(&npa, tpr1, &red, tpr2);
connect(&npa, tpr3, &red, tpr4);
npa.point();
结果如下
只有继承了 QObject类的类,才具有信号槽的能力。 所以,为了使用信号槽,必须继承 QObject。
凡是 QObject 类(不管是直接子类还是间接子类),都应该在第一行代码写
上 Q_OBJECT。不管是不是使用信号槽,都应该添加这个宏。这个宏的展开将
为我们的类提供信号槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI
的反射能力。