C++ Qt信号插槽类作用域类型

C++ Qt信号插槽类作用域类型,c++,qt,qt-signals,slot,C++,Qt,Qt Signals,Slot,给定来自外部SDK的两个标头 class A { public: class B { }; public slots: void onValue(B* b); }; class C { signal: void value(A::B* b); }; 问题是如何连接C->A的信号和插槽,因为数据类型在运行时被视为不兼容 正如您所注意到的,下面的代码报告了一个运行时错误,报告了信号和插槽之间的不兼容: QObject::connect( &c,

给定来自外部SDK的两个标头

class A
{
  public:
   class B
   {
   };
  public slots:
   void onValue(B* b);
};

class C
{
  signal:
   void value(A::B* b);
};

问题是如何连接C->A的信号和插槽,因为数据类型在运行时被视为不兼容

正如您所注意到的,下面的代码报告了一个运行时错误,报告了
信号
插槽
之间的不兼容:

QObject::connect( &c, SIGNAL( value( A::B* ) ), &a, SLOT( onValue( B* ) ) );
错误是:

QObject::connect:发送方/接收方参数不兼容 C::value(A::B*)-->A::onValue(B*)

这是因为
SIGNAL
SLOT
都是宏,调用的兼容性在运行时得到解决,并且在这种情况下失败,因为
A::B
B
是相同的(很可能是因为它显然是一个简单的文本比较)

但这是一个老式的连接命令(Qt5之前)

使用“新样式连接”命令:

QObject::connect( &c, &C::value, &a, &A::onValue );

编译时不会报告错误,运行时也不会报告错误,连接将正常工作。

正如您所注意到的,下面的代码报告运行时错误,报告了
信号
插槽
之间的不兼容:

QObject::connect( &c, SIGNAL( value( A::B* ) ), &a, SLOT( onValue( B* ) ) );
错误是:

QObject::connect:发送方/接收方参数不兼容 C::value(A::B*)-->A::onValue(B*)

这是因为
SIGNAL
SLOT
都是宏,调用的兼容性在运行时得到解决,并且在这种情况下失败,因为
A::B
B
是相同的(很可能是因为它显然是一个简单的文本比较)

但这是一个老式的连接命令(Qt5之前)

使用“新样式连接”命令:

QObject::connect( &c, &C::value, &a, &A::onValue );

编译时不会报告错误,运行时也不会报告错误,连接将正常工作。

B在A范围内是私有的,因此您不能在外部使用它。您可以执行不安全的操作,使用一个空指针,然后将其转换为插槽中的B指针。但是看到B是私有的,除了在A内部之外,没有可能从其他任何地方发出信号。@ddriver抱歉,这是一个输入错误:B是公共的。错误消息是什么?在我看来,这些类型实际上是兼容的。理论上它们是兼容的。但是qt在连接时只关心signal and slot函数中的名称,并在运行时抱怨connect不兼容。B在A的范围内是私有的,因此不能在外部使用它。您可以执行不安全的操作,使用一个空指针,然后将其转换为插槽中的B指针。但是看到B是私有的,除了在A内部之外,没有可能从其他任何地方发出信号。@ddriver抱歉,这是一个输入错误:B是公共的。错误消息是什么?在我看来,这些类型实际上是兼容的。理论上它们是兼容的。但qt在连接时只关心信号和插槽函数中的名称,并在运行时抱怨connect不兼容。