当前位置:  开发笔记 > 编程语言 > 正文

Qt:槽返回值的含义?

如何解决《Qt:槽返回值的含义?》经验,为你挑选了3个好方法。

根据文档,插槽的返回值并不意味着什么.
然而在生成的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();
};

void MyClass::Something() { int res = this->Other(); ... }

编辑:似乎这不是返回值的唯一使用方式,QMetaObject :: invokeMethod方法可用于调用插槽并获取返回值.虽然看起来这样做有点复杂.



1> Terence Simp..:

仅当您要将插槽作为普通成员函数调用时,返回值才有用:

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方法可用于调用插槽并获取返回值.虽然看起来这样做有点复杂.



2> David Dibben..:

通过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调用槽时可以访问槽中的返回值.



3> FxIII..:

当你处理动态语言如qtscript JavaScript QtPython等时非常有用.使用这种语言/绑定,您可以使用MetaObject提供的接口使用C++ QObject.您可能知道,只有信号和插槽由moc解析并生成MetaObject描述.因此,如果您使用来自javascript绑定的C++ QObject,您将只能调用插槽,并且您将需要返回值.通常,动态语言的Qt绑定提供了一些访问普通方法的工具,但这个过程肯定更加模糊.

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有