Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将信号转发到专用信号?_C++_Qt_Qt5_Signals Slots - Fatal编程技术网

C++ 如何将信号转发到专用信号?

C++ 如何将信号转发到专用信号?,c++,qt,qt5,signals-slots,C++,Qt,Qt5,Signals Slots,假设我有以下课程: 类示例:公共QObject{ Q_对象 公众: 显式示例(QObject*parent=nullptr); 无效示例(); 信号: void publicSignal(); 无效私人信号(QPrivateSignal); }; privateSignals使用QPrivateSignal,因此只能由相应的类发出。由于moc编译器从签名中删除了QPrivateSignal,我可以像往常一样使用connect: Example*foo=新示例(此); 示例*bar=新示例(本)

假设我有以下课程:

类示例:公共QObject{
Q_对象
公众:
显式示例(QObject*parent=nullptr);
无效示例();
信号:
void publicSignal();
无效私人信号(QPrivateSignal);
};
privateSignal
s使用
QPrivateSignal
,因此只能由相应的类发出。由于moc编译器从签名中删除了
QPrivateSignal
,我可以像往常一样使用
connect

Example*foo=新示例(此);
示例*bar=新示例(本);
连接(foo,&Example::publicSignal,bar,&Example::Example);//工作正常,签名合适
连接(foo,&Example::privateSignal,bar,&Example::Example);//工作正常,QPrivateSignal不是信号的一部分
我可以轻松地将两个信号变量转发到
publicSignal
变量:

connect(foo,&Example::publicSignal,bar,&Example::publicSignal);//将foo的信号转发给bar
连接(foo,&Example::privateSignal,bar,&Example::publicSignal);//将foo的私人信号转发至酒吧
对于私有信号,这显然是不可能的,即使在
示例的
构造函数中:

Example::Example(QObject*parent):QObject(this){
//假设SimilarExampleClass看起来相同,但不递归
SimilarExampleClass*其他=新的SimilarExampleClass(此);
//这也不会编译
连接(其他,&SimilarExampleClass::publicSignal,此,&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),
         ^
$QTHOME/include/QtCore/qobject.h:在“静态QMetaObject::Connection qobject::connect”(const typename QtPrivate::FunctionPointer::Object*,Func1,const typename QtPrivate::FunctionPointer::Object*,Func2,Qt::ConnectionType)[with Func1=void(SimilarExampleClass::*)();Func2=void(示例:*)(示例::QPrivateSignal);typename QtPrivate::FunctionPointer::Object=SimilarExampleClass;typename QtPrivate::FunctionPointer::Object=Example]':
示例.cpp:107:89:此处为必填项
$QTHOME/include/QtCore/qobject.h:239:9:错误:静态断言失败:插槽需要的参数比信号提供的参数多。
Q_STATIC_ASSERT_X(int(SignalType::ArgumentCount)>=int(SlotType::ArgumentCount),
^
$QTHOME/include/QtCore/qobject.h:241:9:错误:静态断言失败:信号和插槽参数不兼容。
Q_STATIC_ASSERT_X((QtPrivate::CheckCompatibleArguments::value),
^
...
$QTHOME/include/QtCore/qobject.h:在“静态QMetaObject::Connection qobject::connect(常量typename QtPrivate::FunctionPointer::Object*,Func1,常量typename QtPrivate::FunctionPointer::Object*,Func2,Qt::ConnectionType)[with Func1=void(SimilarExampleClass::*)(SimilarExampleClass::QPrivateSignal);Func2=void(示例:*)(示例::QPrivateSignal);typename QtPrivate::FunctionPointer::Object=SimilarExampleClass;typename QtPrivate::FunctionPointer::Object=Example]':
示例.cpp:108:90:此处为必填项
$QTHOME/include/QtCore/qobject.h:241:9:错误:静态断言失败:信号和插槽参数不兼容。
Q_STATIC_ASSERT_X((QtPrivate::CheckCompatibleArguments::value),
^

有什么方法可以在信号的类中使用私有信号作为
connect
的目的地吗?

不幸的是,没有一个小助手。Qt的自动
QPrivateSignal
从其
connect
语法中的信号中筛选不会转移到其slot参数。因此,您需要一个lambda作为
变量充足的

连接(其他,&SimilarExampleClass::publicSignal,this,[this](){ 发出私有信号({}); });