簡體   English   中英

具有輸出參數的Qt invokeMethod調用函數

[英]Qt invokeMethod calling function having output argument

我試圖弄清楚QMetaObject :: invokeMethod的用法。 我有一個具有一個參數(非常量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+類型安全信號和插槽。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM