【问题标题】:It is possible connect a QML Object existing signal in C++ QObject::connect()?可以在 C++ QObject::connect() 中连接 QML 对象现有信号吗?
【发布时间】:2018-05-07 17:23:51
【问题描述】:

QML TreeView 有一个名为:doubleClicked(QModelIndex) 的信号

参考:https://doc.qt.io/qt-5.10/qml-qtquick-controls-treeview.html#doubleClicked-signal

它可能在 C++ QObject::connect() 中连接现有信号??

我试过了:

QQmlApplicationEngine engine;
QObject *myTreeMenu = engine.rootObjects().at(0)->findChild<QObject*>("myTreeMenu");
connect(myTreeMenu , SIGNAL(doubleClicked(QModelIndex)), this, SLOT(slotModelClicked(QModelIndex)));

但我收到此返回错误:

QObject::connect: No such signal TreeView_QMLTYPE_63_QML_68::doubleClicked(QModelIndex) in '...'
QObject::connect:  (sender name:   'myTreeMenu ')

【问题讨论】:

  • 这部分文档可能会有所帮助:doc.qt.io/qt-5/…
  • @Justin 我看到了,但是在这部分他们重新创建了信号,我想知道它是否可能与已经存在的信号连接

标签: c++ qt qml signals-slots


【解决方案1】:

documentation for Qt 5.11 解释了为什么这不是使用 C++ 和 QML 的最佳方式。我建议您改为在 C++ 对象中公开一个插槽或 Q_INVOKABLE 并在 onDoubleClicked 处理程序中调用它:

Q_INVOKABLE void doStuff();

在 QML 中:

onDoubleClicked: cppObject.doStuff()

文档有一个“之前和之后”的例子来证明这一点;这是大部分内容:

使用这种方法,对对象的引用是从 QML 中“拉出”的。这 问题在于 C++ 逻辑层依赖于 QML 表示层。如果我们以这样的方式重构 QML objectName 发生变化,或其他一些变化破坏了 C++ 找到 QML 对象,我们的工作流程变得更加 复杂而乏味。

重构 QML 比重构 C++ 容易得多,所以为了 让维护无痛,我们应该努力让 C++ 类型不知道 尽可能多地使用 QML。这可以通过“推”来实现 将 C++ 类型引用到 QML:

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    Backend backend;

    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("backend", &backend);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

QML 然后直接调用 C++ 槽:

import QtQuick 2.11
import QtQuick.Controls 2.4

Page {
    Button {
        text: qsTr("Restore default settings")
        onClicked: backend.restoreDefaults()
    }
}

使用这种方法,C++ 保持不变,如果 QML 未来需要重构。

在上面的例子中,我们在根上下文中设置了一个上下文属性为 将 C++ 对象公开给 QML。这意味着该属性是 可用于引擎加载的每个组件。上下文属性 对于在 QML 发布后必须立即可用的对象很有用 已加载,无法在 QML 中实例化。

Integrating QML and C++ 演示了一种替代方法,其中 QML 知道 C++ 类型,以便它可以自己实例化它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    相关资源
    最近更新 更多