具有输出参数的QT InvoKeMethod调用函数

Qt invokeMethod calling function having output argument

本文关键字:InvoKeMethod 调用 函数 QT 输出 参数      更新时间:2023-10-16

我正在尝试找出qmetaObject :: InvokeMethod的用法。我的函数具有一个参数(非const qString(,我希望它是输出,该函数没有返回值,在其上调用InvokeMethod总是失败的,而另一个具有返回值的函数,没有参数可以调用成功地。这是代码:

myclass.h

#include <QDebug>
class MyClass: public QObject
{
    Q_OBJECT
public:
    MyClass() {}
    ~MyClass() {}
public slots:
    QString func();
    void func2(QString& res);
};

myclass.cpp

#include "myclass.h"
QString MyClass::func()
{
    QString res = "func succeeded";
    qDebug() << res;
    return res;
}
void MyClass::func2(QString& res)
{
    res = "func2 succeeded";
    qDebug() << res;
    return;
}

main.cpp

#include <QCoreApplication>
#include "myclass.h"
int main(int argc, char *argv[])
{
    QString msg;
    MyClass myobj;
    QCoreApplication a(argc, argv);
    bool val = QMetaObject::invokeMethod(&myobj, "func", Q_RETURN_ARG(QString, msg));
    qDebug() << "func returns" << val;
    val = QMetaObject::invokeMethod(&myobj, "func2", Q_RETURN_ARG(QString, msg));
    qDebug() << "func2 returns" << val;
    int ret = a.exec();
    return ret;
}

这是结果:

$ ./test
"func succeeded"
func returns true
QMetaObject::invokeMethod: No such method MyClass::func2()
Candidates are:
    func2(QString&)
func2 returns false

我尝试了许多不同的方法,无法使它起作用,有人知道原因吗?预先感谢!

使用q_return_arg是为了获取该方法返回的值,但是如果要通过一些参数,则必须使用q_arg:

#include <QCoreApplication>
#include "myclass.h"
int main(int argc, char *argv[])
{
    QString msg;
    MyClass myobj;
    QCoreApplication a(argc, argv);
    bool val = QMetaObject::invokeMethod(&myobj, "func", Q_RETURN_ARG(QString, msg));
    qDebug() << "func returns" << val;
    val = QMetaObject::invokeMethod(&myobj, "func2", Q_ARG(QString &, msg));
    qDebug() << "func2 returns" << val;
    int ret = a.exec();
    return ret;
}

输出:

"func succeeded"
func returns true
"func2 succeeded"
func2 returns true

错误消息说明了一切。该类没有签名MyClass:func2()的方法。

您已将功能声明为具有签名:void func2(QString&),它与QString& func2()不同。您使用 作为返回值与QT信号和插槽代码名称方法或查找它们无关,实际上与呼叫签名。呼叫签名是什么,QT不能神圣您打算如何使用参数。

最简单的修复方法是改变您调用该方法的方式。您需要有

QMetaObject::invokeMethod(&myobj, "func2", Q_ARG(QString, msg));

或更好的是,使用QT 5.0 typesafe信号和插槽。

QMetaObject::invokeMethod(&myobj, &MyClass::func2, &msg);