2

这是我要调用的方法原型:

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始终设置为假。

我认为问题是我的函数返回一个const QString&. 我怎样才能得到返回值呢?

谢谢

编辑:不改变我的方法的原型

编辑2:代码

主文件

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);
    }
};
4

2 回答 2

1

简短的回答是,不幸的是,您不应该在不修改签名的情况下实现这一点。请参阅下面的可能选项。请挑选最适合您的。

您应该使用QStringRef,如下所示:

const QStringRef getTitle() { return &myString; }

接着:

QStringRef ReturnValue;
bool ok = QMetaObject::invokeMethod(obj, "getTitle",
                                    Qt::DirectConnection,
                                    Q_RETURN_ARG(QStringRef, ReturnValue));

它确实改变了签名,但它已经完成了。或者,您可以查看是否可以使用 注册 QString& 元类型qRegisterMetaType,但实际上,像这样的用例是 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));

这取决于您的特定情况,但这些是此处的选项。

于 2013-10-03T14:38:57.893 回答
0

以下代码适用于我:

QString res;

bool invoked = QMetaObject::invokeMethod(obj,
                                         methodName.toAscii(),
                                         Q_RETURN_ARG(QString, res));

但是,我不使用插槽表示法,而是使用Q_INVOKABLE前缀:

public:
    Q_INVOKABLE QString getTitle() const;
于 2013-10-03T14:50:57.503 回答