gpt4 book ai didi

c++ - Qt - invokeMethod 由于返回值而失败

转载 作者:太空宇宙 更新时间:2023-11-04 11:48:33 30 4
gpt4 key购买 nike

这是我要调用的方法的原型(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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com