一個QML信號連接到一個普通的C++插槽很簡單:連接QML信號C++ 11拉姆達插槽(QT 5)
// QML
Rectangle { signal foo(); }
// C++ old-style
QObject::connect(some_qml_container, SIGNAL(foo()), some_qobject, SLOT(fooSlot()); // works!
但是,不管我怎麼努力,我似乎無法能夠連接到C++ 11 lambda功能插槽。
// C++11
QObject::connect(some_qml_container, SIGNAL(foo()), [=]() { /* response */ }); // fails...
QObject::connect(some_qml_container, "foo()", [=]() { /* response */ }); // fails...
這兩次嘗試都失敗並出現函數簽名錯誤(沒有QObject :: connect overload可以接受這些參數)。但是,Qt 5文檔意味着這應該是可能的。
不幸的是,Qt的5例的C++信號總是連接到C++拉姆達槽:
// C++11
QObject::connect(some_qml_container, &QMLContainer::foo, [=]() { /* response */ }); // works!
此語法不能爲QML信號工作,因爲QMLContainer :: foo的簽名不是在編譯時已知(並且手動聲明QMLContainer :: foo會首先破壞使用QML的目的。)
正在嘗試做什麼?如果是這樣,QObject :: connect調用的正確語法是什麼?
感謝您的回答,這給了我一個新的方向來尋找答案:是否有可能獲得C++指針到QML信號?如果是這樣,我可以將一個std ::函數綁定到該信號,並將一個lambda綁定到該插槽。 不幸的是,將每個QML信號鏡像到一個C++ QObject中(可以說)是一種比定義QObject中的插槽更糟糕的設計(即舊式的方法)。我想要做的就是完全避免使用QObject,並利用新的Qt 5接口(可能或不可能)。 – 2013-03-26 08:49:46
那麼,自動發生信號 - 信號連接可能意味着它只是一個額外的代碼行,類似於在聲明QML查看器之後的這一行:'MyQMLSignalRouter qmlSignals(&myQmlView.rootObject());'然後在新中使用'qmlSignals'式連接調用。 QML信號並不作爲C++函數存在,它們不能(它們是動態的,C++是靜態的),所以直接指向它們的方法指針在理論上是不可能的,據我所知。 – hyde 2013-03-26 09:04:18
我對此方法的懷疑在於它引入的QML信號與C++代碼之間的緊密耦合,以及單一的「超類」方法(一個類聲明所有信號,無處不在)。真難聞! 你是完全正確的,QML信號靜態不可用於C++。然而,動態解決方案可能存在: QQuickItem :: metaObject() - > indexOfSignal(「foo()」) 正確返回該信號的索引。 AFAICT,用於獲取可調用封裝的管道也存在,但隱藏在QtPrivate命名空間中。遊民。 – 2013-03-26 10:07:17