c++ - 如何将信号转发到私有信号?
问题描述
假设我有以下课程:
class Example : public QObject {
Q_OBJECT
public:
explicit Example(QObject * parent = nullptr);
void example();
signals:
void publicSignal();
void privateSignal(QPrivateSignal);
};
privateSignal
s 使用 a ,因此QPrivateSignal
只能由各自的类发出。由于 moc 编译器QPrivateSignal
从签名中删除了 ,我可以connect
照常使用:
Example * foo = new Example(this);
Example * bar = new Example(this);
connect(foo, &Example::publicSignal, bar, &Example::example); // works fine, signatures fit
connect(foo, &Example::privateSignal, bar, &Example::example); // works fine, QPrivateSignal not part of signal
我可以轻松地将两个信号变体转发到publicSignal
变体:
connect(foo, &Example::publicSignal, bar, &Example::publicSignal); // forward foo's signals to bar
connect(foo, &Example::privateSignal, bar, &Example::publicSignal); // forward foo's private signals to bar
这对于私有信号显然是不可能的,即使在Example's
构造函数中也是如此:
Example::Example(QObject * parent) : QObject(this) {
// Suppose that SimilarExampleClass looks the same but does not recurse
SimilarExampleClass * other = new SimilarExampleClass(this);
// this does not compile either
connect(other, &SimilarExampleClass::publicSignal, this, &Example::privateSignal);
}
这两种情况都会导致以下错误:
$QTHOME/include/QtCore/qobject.h: In instantiation of ‘static QMetaObject::Connection QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const typename QtPrivate::FunctionPointer<Func2>::Object*, Func2, Qt::ConnectionType) [with Func1 = void (SimilarExampleClass::*)(); Func2 = void (Example::*)(Example::QPrivateSignal); typename QtPrivate::FunctionPointer<Func>::Object = SimilarExampleClass; typename QtPrivate::FunctionPointer<Func2>::Object = Example]’:
example.cpp:107:89: required from here
$QTHOME/include/QtCore/qobject.h:239:9: error: static assertion failed: The slot requires more arguments than the signal provides.
Q_STATIC_ASSERT_X(int(SignalType::ArgumentCount) >= int(SlotType::ArgumentCount),
^
$QTHOME/include/QtCore/qobject.h:241:9: error: static assertion failed: Signal and slot arguments are not compatible.
Q_STATIC_ASSERT_X((QtPrivate::CheckCompatibleArguments<typename SignalType::Arguments, typename SlotType::Arguments>::value),
^
...
$QTHOME/include/QtCore/qobject.h: In instantiation of ‘static QMetaObject::Connection QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const typename QtPrivate::FunctionPointer<Func2>::Object*, Func2, Qt::ConnectionType) [with Func1 = void (SimilarExampleClass::*)(SimilarExampleClass::QPrivateSignal); Func2 = void (Example::*)(Example::QPrivateSignal); typename QtPrivate::FunctionPointer<Func>::Object = SimilarExampleClass; typename QtPrivate::FunctionPointer<Func2>::Object = Example]’:
example.cpp:108:90: required from here
$QTHOME/include/QtCore/qobject.h:241:9: error: static assertion failed: Signal and slot arguments are not compatible.
Q_STATIC_ASSERT_X((QtPrivate::CheckCompatibleArguments<typename SignalType::Arguments, typename SlotType::Arguments>::value),
^
有什么方法可以在信号类中使用私有信号作为目的地connect
?
解决方案
不幸的是,并非没有一个小帮手。QtQPrivateSignal
从其connect
语法中的信号中自动过滤器不会移植到它的 slot 参数。因此,您需要一个 lambda Example
:
connect(other, &SimilarExampleClass::publicSignal, this, [this](){
emit privateSignal({});
});
推荐阅读
- python-3.x - 无法使用 python 从 redmart 获取产品标题
- javascript - Alert On input Field 在表单中单击 3 次
- javascript - 使用 html 和 javascript 进行表单验证
- c# - 打开 XML 创建多个工作表
- c# - 在 HttpRequestException 之后使用 Polly 重试
- java - Java中Double类型的“无穷大”如何
- python-2.7 - 如何在机器人框架中使用监听器
- python - 从文本文件中为实体创建带有注释的 json 文件,并将 startIndex 和 endIndex 附加到字典中
- firebase - 当应用程序处于后台(最小化)时,推送通知不起作用 - iOS
- javascript - 下载文件到本地计算机发送附加到消息不和谐