[英]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 :代碼
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();
}
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.