簡體   English   中英

是否可以在C ++ QObject :: connect()中連接QML對象的現有信號?

[英]It is possible connect a QML Object existing signal in C++ QObject::connect()?

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

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() } } 

通過這種方法,如果將來需要重構QML,則C ++保持不變。

在上面的示例中,我們在根上下文上設置了上下文屬性,以將C ++對象公開給QML。 這意味着該屬性可用於引擎加載的每個組件。 上下文屬性對於必須在QML加載后立即可用且無法在QML中實例化的對象很有用。

集成QML和C ++演示了一種替代方法,該方法使QML了解C ++類型,從而可以自己實例化它。

暫無
暫無

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

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