具有输出参数的QT InvoKeMethod调用函数
Qt invokeMethod calling function having output argument
我正在尝试找出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);
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- QMetaObject invokeMethod的基于函数指针的语法
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 为什么我不能调用 QMetaObject::invokeMethod(&threadObj, &QThread::start, Qt::QueuedConnection)?
- 具有输出参数的QT InvoKeMethod调用函数
- QMetaObject::invokeMethod()在用于调用QListWidget::addItem()时返回fal
- 如果我从线程到singletone调用QMetaObject::invokeMethod,则调用仍在该qthread中
- 使用可变数量的参数调用QMetaObject::invokeMethod()