具有输出参数的 Qt invokeMethod 调用函数
Qt invokeMethod calling function having output argument
我正在尝试找出 QMetaObject::invokeMethod 的用法。我有一个函数,它有一个参数(非 const QString),我希望它是输出,该函数没有 return 值,对其调用 invokeMethod 总是失败,而另一个函数具有 return 值且没有参数可以成功调用。这是代码:
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 is to get the value that the method returns, but if you want to pass some argument you must use 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
错误消息说明了一切。 class 没有签名为 MyClass:func2()
的方法。
您已声明该函数具有签名:void func2(QString&)
,这与 QString& func2()
不同。您 使用 函数的参数作为 return 值这一事实与 Qt 信号和槽代码命名方法或查找它们的方式无关,事实上, 与呼叫签名完全无关。调用签名是什么,Qt 无法预测您打算如何使用这些参数。
最简单的解决方法是更改调用方法的方式。你需要
QMetaObject::invokeMethod(&myobj, "func2", Q_ARG(QString, msg));
或者,更好的是,使用 Qt 5.0+ 类型安全信号和槽。
QMetaObject::invokeMethod(&myobj, &MyClass::func2, &msg);
我正在尝试找出 QMetaObject::invokeMethod 的用法。我有一个函数,它有一个参数(非 const QString),我希望它是输出,该函数没有 return 值,对其调用 invokeMethod 总是失败,而另一个函数具有 return 值且没有参数可以成功调用。这是代码:
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 is to get the value that the method returns, but if you want to pass some argument you must use 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
错误消息说明了一切。 class 没有签名为 MyClass:func2()
的方法。
您已声明该函数具有签名:void func2(QString&)
,这与 QString& func2()
不同。您 使用 函数的参数作为 return 值这一事实与 Qt 信号和槽代码命名方法或查找它们的方式无关,事实上, 与呼叫签名完全无关。调用签名是什么,Qt 无法预测您打算如何使用这些参数。
最简单的解决方法是更改调用方法的方式。你需要
QMetaObject::invokeMethod(&myobj, "func2", Q_ARG(QString, msg));
或者,更好的是,使用 Qt 5.0+ 类型安全信号和槽。
QMetaObject::invokeMethod(&myobj, &MyClass::func2, &msg);