这是我要调用的方法的原型(prototype):
const QString& FieldForm::getTitle(void) const;
我必须通过 Qt 函数调用此方法:invokeMethod
。
这是我的 invokeMethod 调用:
bool ok = QMetaObject::invokeMethod(obj, MethodeName.toStdString().c_str(), Qt::DirectConnection, Q_RETURN_ARG(const QString, ReturnValue));
ok
始终设置为 false。
我认为问题是我的函数返回一个 const QString&
。我怎样才能得到返回值?
谢谢
编辑:不改变我的方法原型(prototype)
Edit2:代码
main.cpp
int main(int argc, char **argv)
{
qRegisterMetaType("FieldForm");
qRegisterMetaType("FieldForm*");
QApplication app(argc, argv);
FieldForm *obj = new FieldForm;
obj->setTitle("MyTitle");
QString MethodName = "getTitle";
QString ReturnValue;
bool ok = QMetaObject::invokeMethod(obj, MethodName.toStdString().c_str(), Qt::DirectConnection, Q_RETURN_ARG(QString, ReturnValue));
return app.exec();
}
FieldForm.h
class FieldForm : public QObject
{
Q_OBJECT
private:
QString Title;
public slots:
const QString& getTitle(void) const
{
return (this->Title);
}
};
最佳答案
简短的回答是,不幸的是,您不应该在不修改签名的情况下实现这一目标。请参阅下面的可能选项。请选择最适合您的。
你应该使用 QStringRef如:
const QStringRef getTitle() { return &myString; }
然后:
QStringRef ReturnValue;
bool ok = QMetaObject::invokeMethod(obj, "getTitle",
Qt::DirectConnection,
Q_RETURN_ARG(QStringRef, ReturnValue));
它确实改变了签名,但它是永久性的。或者,您可以查看是否可以使用 qRegisterMetaType
注册 QString& 元类型,但实际上,像这样的用例是 QStringRef 存在的原因。
如果你愿意,你也可以使用指针返回值,或者甚至只是值类型,因为 QString 是 Copy-On-Write .在那种特殊情况下,您可以更改为这样的内容:
// const return value type is not necessarily here though.
const QString getTitle() const { return myString; }
然后:
QString ReturnValue;
bool ok = QMetaObject::invokeMethod(obj, "getTitle", Qt::DirectConnection,
Q_RETURN_ARG(QString, ReturnValue));
这取决于您的特定场景,但这些是此处的选项。
关于c++ - Qt - invokeMethod 由于返回值而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19160211/