Qt信号插槽连接-只允许信号的特定类型的连接



我有一个基于Qt的库,它有一个可以发出信号的对象,但也可以在后台异步执行一些操作。

库的用户可以使用Qt::DirectConnectionQt::BlockingQueuedConnection连接对象发出的信号,这将劫持对象的专用线程,从而可能破坏其功能。

有没有一种方法只允许使用给定类型的连接来连接信号?Qt::QueuedConnection。这样,当用户尝试使用任何其他类型的连接时,就会出现编译错误。

您可以使用在公共接口中声明的代理信号,并使用排队连接将您自己的内部信号连接到该信号。因此,用户将能够以任何方式(直接或排队(使用此信号,但它将已经通过排队连接发出。

由于信号不能是私有的,所以一旦在类中声明了它们,就无法隐藏它们。一种解决方案是使用PIMPL向用户隐藏内部信号。该示例仅显示信号之间的排队连接,但不显示PIMPL:

#include <QObject>
class InternalSignal : public QObject
{
Q_OBJECT
public:
explicit InternalSignal(QObject *parent = nullptr) : QObject{parent} {
connect(this, &InternalSignal::myPIMPLSignal, this, &InternalSignal::mySignal, Qt::QueuedConnection);
}
signals:
void mySignal();
void myPIMPLSignal(); // move this signal to PIMPL class
};

最新更新