[英]Accessing Qt / QML objects with C++
我正在研究一個C ++ Qt項目,該項目最終將與串行端口通信。 其中一部分是在C ++部分中訪問QML對象。 我有可以設置QML屬性的代碼,但是現在訪問那些作為方法的功能很麻煩。 查看以下代碼:
object = view.rootObject();
rect = object->findChild<QObject *>("box");
rect->setProperty("color", "red"); // Verifies the object tree is accessible
viewer = object->findChild<QObject *>("viewer"); // Access the viewer text box
viewer->append("dummy text"); // OOPS! This doesn't compile!!!
現在,將類型設置為方法setProperty(..),但如何訪問對象的方法。 “查看器”是一個TextArea,我想先執行一次selectAll(),然后執行cut()清除框。
這里的問題是如何編碼? 謝謝大家
當然,它不會編譯, QObject
沒有append()
方法。
如果它是C ++函數,則必須將qobject_cast
轉換為具有它的適當類型。 但是,對於在C ++中實現的許多現有QML類型,這並不總是很容易獲得,並且作為C ++類型,它們不是公共API的一部分,通常也不打算供最終用戶直接使用。
如果它是JS函數,則必須使用QMetaObject::invokeMethod
。 這也適用於已生成元數據的C ++函數。 setProperty()
也是如此,而setColor()
不能與QObject*
一起工作,就像append()
不能那樣。
最后但並非最不重要的一點是,絕對沒有充分的理由讓您使用C ++進行此類操作。 從C ++使用QML對象的設計較差,而且是反模式的。 您只會養成這樣做的壞習慣。 這種相互作用必須限於使用信號,時隙和屬性的明確定義的接口。 一般來說,QML可以進入C ++,因為這只能通過公開的接口進行,但是即使可能,也不應采用相反的方式。
這樣想吧-汽車使用發動機,發動機不使用汽車。 發動機控制通過啟動鍵和油門踏板連接,不直接使用。 C ++內容應保留給應用程序引擎-高性能或高效核心邏輯或后端,而QML部分用於GUI /前端。
在這里使用invoke方法使用發布的答案,這是有效的解決方案:
// C++ Code to call function reset()
QMetaObject::invokeMethod(object, "reset");
// QML code to select all text the delete it
function reset() {
viewer.selectAll()
viewer.cut()
}
作者的QML部分可能會公開別名屬性,以對所需的文本字段內容進行操作:
import QtQuick 2.0
import QtQuick.Controls 1.2
Item {
property alias viewerText: viewer.text // added
width: 350
height: 450
TextArea {
id: viewer
x: 8
y: 8
width: 223
height: 415
text: "text"
font.pixelSize: 12
objectName: "viewer"
}
Button {
id: open
x: 251
y: 8
text: "Open"
}
}
然后作者的C ++部分可以輕松做到:
auto* object = view.rootObject();
viewer = object->findChild<QObject *>("viewer");
viewer->setProperty("viewerText", "dummy text"); // using the new property added
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.