根据文档,插槽的返回值并不意味着什么.
然而在生成的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;
Terence Simp.. 14
仅当您要将插槽作为普通成员函数调用时,返回值才有用:
class MyClass : public QObject { Q_OBJECT public: MyClass(QObject* parent); void Something(); public Q_SLOTS: int Other(); };编辑:似乎这不是返回值的唯一使用方式,QMetaObject :: invokeMethod方法可用于调用插槽并获取返回值.虽然看起来这样做有点复杂.void MyClass::Something() { int res = this->Other(); ... }
仅当您要将插槽作为普通成员函数调用时,返回值才有用:
class MyClass : public QObject { Q_OBJECT public: MyClass(QObject* parent); void Something(); public Q_SLOTS: int Other(); };编辑:似乎这不是返回值的唯一使用方式,QMetaObject :: invokeMethod方法可用于调用插槽并获取返回值.虽然看起来这样做有点复杂.void MyClass::Something() { int res = this->Other(); ... }
通过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;
vector _a是传递给qt_metacall的参数列表.这是由QMetaObject :: invokeMethod传递的.因此,moc生成的代码中的返回值被保存并传递回调用者.因此,对于正常的信号槽交互,返回值根本不用于任何事物.但是,存在这样的机制,以便在通过invokeMethod调用槽时可以访问槽中的返回值.
当你处理动态语言如qtscript JavaScript QtPython等时非常有用.使用这种语言/绑定,您可以使用MetaObject提供的接口使用C++ QObject.您可能知道,只有信号和插槽由moc解析并生成MetaObject描述.因此,如果您使用来自javascript绑定的C++ QObject,您将只能调用插槽,并且您将需要返回值.通常,动态语言的Qt绑定提供了一些访问普通方法的工具,但这个过程肯定更加模糊.