Qt 信号槽 class 范围类型
Qt Signal Slots class scope types
给定两个来自外部 SDK 的 headers,
class A
{
public:
class B
{
};
public slots:
void onValue(B* b);
};
class C
{
signal:
void value(A::B* b);
};
问题是我如何连接 C -> A 的信号和槽,因为数据类型在 运行 时间内被认为是不兼容的。
如您所见,下面的代码报告 signal
和 slot
之间的运行时错误报告不兼容:
QObject::connect( &c, SIGNAL( value( A::B* ) ), &a, SLOT( onValue( B* ) ) );
错误是:
QObject::connect: Incompatible sender/receiver arguments
C::value(A::B*) --> A::onValue(B*)
这是因为 SIGNAL
和 SLOT
是宏,调用的兼容性在运行时解决,当它应该作为 A::B
和 B
工作时失败了。是相同的(很可能是因为它显然是一个简单的文本比较)。
但这是旧式连接命令(Qt5 之前)。
使用新式连接命令:
QObject::connect( &c, &C::value, &a, &A::onValue );
编译时和运行时都不会报错,连接正常。
给定两个来自外部 SDK 的 headers,
class A
{
public:
class B
{
};
public slots:
void onValue(B* b);
};
class C
{
signal:
void value(A::B* b);
};
问题是我如何连接 C -> A 的信号和槽,因为数据类型在 运行 时间内被认为是不兼容的。
如您所见,下面的代码报告 signal
和 slot
之间的运行时错误报告不兼容:
QObject::connect( &c, SIGNAL( value( A::B* ) ), &a, SLOT( onValue( B* ) ) );
错误是:
QObject::connect: Incompatible sender/receiver arguments C::value(A::B*) --> A::onValue(B*)
这是因为 SIGNAL
和 SLOT
是宏,调用的兼容性在运行时解决,当它应该作为 A::B
和 B
工作时失败了。是相同的(很可能是因为它显然是一个简单的文本比较)。
但这是旧式连接命令(Qt5 之前)。
使用新式连接命令:
QObject::connect( &c, &C::value, &a, &A::onValue );
编译时和运行时都不会报错,连接正常。