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

标签 c++ qt qtcore

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

相关文章:

c++ - 在 C++ 中读取 xml 文件

c++ - 应答一个 UDP 数据包

python - PyQt:以编程方式创建 QT 小部件

qt - Qt音频编辑

c++ - Qt 应用程序 C++ 的自定义小部件

c++ - 在Qt中将数据保存到文件

c# - 在 C++ 中序列化然后在 C# 中反序列化?

c++ - 如何在另一个程序更新时流式显示文本文件?

c++ - 重载 new 和 delete C++ 以跟踪内存分配

c++ - 小端顺序转换为十六进制的函数时出错