Qt:插槽返回值的含义?
根据文档,插槽的返回值没有任何意义。
但是在生成的Moc代码中,我看到如果插槽返回一个值,则此值将用于某些操作。知道它是做什么的吗?
这是我在说的一个例子。这是从moc生成的代码中获取的。 'message'是一个不返回任何内容的插槽,'selectPart'被声明为返回int。
case 7: message((*reinterpret_cast< const QString(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break; case 8: { int _r = selectPart((*reinterpret_cast< AppObject*(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break;
解决方案
纵观Qt源,似乎当从QMetaObject :: invokeMethod调用插槽时,可以指定返回类型并获得返回值。 (看看Qt帮助中的invokeMethod)
我找不到Qt源中实际使用的许多示例。我发现的是
bool QAbstractItemDelegate::helpEvent
这是具有返回类型的插槽,从中调用
QAbstractItemView::viewportEvent
使用invokeMethod。
我认为,仅当直接调用该函数(当它是普通的C ++函数)或者使用invokeMethod时,才可以使用插槽的返回值。我认为这实际上是为了内部Qt函数,而不是在使用Qt的程序中正常使用。
编辑:
对于示例案例:
case 8: { int _r = selectPart((*reinterpret_cast< AppObject*(*)>(_a[1])), *reinterpret_cast< int(*)>(_a[2]))); if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break;
向量_a是传递给qt_metacall的参数列表。这是由QMetaObject :: invokeMethod传递的。因此,moc生成的代码中的返回值将保存并传递回调用方。因此,对于正常的信号-插槽交互,返回值根本不用于任何东西。但是,存在该机制,因此,如果通过invokeMethod调用了插槽,则可以访问插槽的返回值。
仅当我们想将插槽作为普通成员函数调用时,返回值才有用:
`
class MyClass : public QObject { Q_OBJECT public: MyClass(QObject* parent); void Something(); public Q_SLOTS: int Other(); }; void MyClass::Something() { int res = this->Other(); ... }
`
编辑:似乎这不是返回值可以使用的唯一方法,QMetaObject :: invokeMethod方法可以用于调用插槽并获取返回值。尽管看起来这有点复杂。
当我们处理诸如qtscript JavaScript QtPython之类的动态语言时,它非常有用。使用此语言/绑定,我们可以使用MetaObject提供的接口来动态地使用C ++ QObject。我们可能知道,moc仅解析信号和时隙并生成MetaObject描述。因此,如果我们使用的是Javascript绑定中的C ++ QObject,则可以仅调用广告位,并且需要返回值。通常,针对动态语言的Qt绑定为常规方法提供了一些便利,但是该过程绝对更加琐碎。