簡體   English   中英

Qt-invokeMethod因返回值而失敗

[英]Qt - invokeMethod failed because of return value

這是我要調用的方法的原型:

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& 我怎樣才能得到返回的值?

謝謝

編輯 :不更改我的方法的原型

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

這取決於您的特定方案,但是這些是此處的選項。

以下代碼對我有用:

QString res;

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

但是,我不使用插槽符號,而是使用Q_INVOKABLE前綴:

public:
    Q_INVOKABLE QString getTitle() const;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM