c++ - Qt/Qml 和方法重载

标签 c++ qt qml moc

在从 Qml 中调用重载的 C++ 方法并试图了解其背后的原因时,刚刚遇到 Qt 框架的奇怪行为。假设我有一个 QList<QVariant> -like 具有以下方法的类:

...
Q_SLOT void append(const QVariant &item);
Q_SLOT void append(const QVariantList &items);
Q_SLOT void insert(int index, const QVariant &item);
Q_SLOT void insert(int index, const QVariantList &items);
...

Qml:

onclicked: {
  var itemCount = myListObject.size();
  myListObject.insert(itemCount, "Item " + (itemCount + 1));
}

Qt 以某种方式决定调用 void insert(int index, const QVariantList &items)重载 items参数设置为 a null QVariant 一个空的 QVariantList而不是 void insert(int index, const QVariant &item)重载 QString包裹在 QVariant .

现在,如果我按如下方式更改声明顺序,它会按预期工作:

Q_SLOT void insert(int index, const QVariantList &items);
Q_SLOT void insert(int index, const QVariant &item);

我在 Qt 框架的文档中找不到任何关于声明顺序以及它如何影响方法在调用期间解析的方式。

有人可以解释一下吗?谢谢。

最佳答案

这个问题与 JavaScript 中的重载有关。一旦您了解了它——您就会理解您的代码“奇怪行为”的原因。看看 Function overloading in Javascript - Best practices 就知道了。

简而言之——我建议你接下来做:因为你可以在两侧(QML 和 Qt/C++)操作 QVariant 变量——将变量作为参数传递,并在 Qt 上处理它/C++ 端随心所欲。

你可以这样使用:

您的 C++ 类已创建并传递给 QML(例如作为 setContextProperty("TestObject", &tc)):

public slots:
    Q_SLOT void insert(const int index, const QVariant &something) {
        qDebug() << __FUNCTION__;
        if (something.canConvert<QString>()) {
            insertOne(index, something.toString());
        } else if (something.canConvert<QStringList>()) {
            insertMany(index, something.toStringList());
        }
    }

private slots:
    void insertOne(int index, const QString &item) {
        qDebug() << __FUNCTION__ << index << item;
    }

    void insertMany(int index, const QStringList &items) {
        qDebug() << __FUNCTION__ << index << items;
    }

QML 中的某处:

Button {
    anchors.centerIn: parent
    text: "click me"
    onClicked: {
        // Next line will call insertOne
        TestObject.insert(1, "Only one string")
        // Next line will call insertMany
        TestObject.insert(2, ["Lots", "of", "strings"])
        // Next line will call insertOne
        TestObject.insert(3, "Item " + (3 + 1))
        // Next line will call insertOne with empty string
        TestObject.insert(4, "")
        // Next line will will warn about error on QML side:
        // Error: Insufficient arguments
        TestObject.insert(5)
    }
}

关于c++ - Qt/Qml 和方法重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28529776/

相关文章:

c++ - 创建小部件的指南

python - 在 QQuickWidget 内更新/重新绘制仪表

Qt QML RoundButton 图标不填充项目

c++ - 我的弹射器游戏产生的距离不正确

c++ - QObjects的销毁

c++ - to_string 函数追加零

qt - 如何为 Qt Creator 使用 MongoDB C 驱动程序?

c++ - 是否可以从对象而不是类注册 QML 类型?

c++ - 整数的默认值?

c++ - Hook dll中的特定函数