[英]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.