gpt4 book ai didi

qt - QML 在匿名孙子之间发送信号

转载 作者:行者123 更新时间:2023-12-05 05:23:25 25 4
gpt4 key购买 nike

我试图在树结构中的 qml 组件之间进行通信。我有一个 main.qml 组件,其 id 为 root。它有两个 child ,每个 child 都有任意数量的 child ,这些 child 是根据转发器和模型动态创建的。

当其中一个孙子被点击时,我希望其他人知道并能够采取行动。因此,如果我可以在孙辈之间发送信号,那会很好。

问题是它们都没有设置 id 属性,因为它们是动态生成的,并且其中一些在不同的范围内。为了在它们之间进行通信,我做了以下操作:在 root 中创建一个函数,每个孙子都可以看到,并且可以使用消息作为参数调用它。然后根函数发出一个信号,将消息作为参数。所有的孙子都可以连接到信号,因为他们知道 root 的 id。

人们对此有何看法?我感觉我错过了 qml 中的信号点,感觉就像我实现了一个粗略的系统并且错过了整个要点或其他东西。

此外,我想远离 C++ 世界,但人们是否认为最好使用 C++ 类以便我可以使用信号和槽。

我的目标是具有非常松耦合的 MVC 结构和一个集中式 Controller 。人们如何看待 MVC 中 QML 组件之间的通信。

我在这里发现的唯一类似问题是关于 C++ 或在组件上使用硬编码 ID。

我认为 id 不能动态设置,甚至不能在创建时设置一次;我错了吗?

另外,组件在不同的范围内,所以无法解析id;我错了吗?

我写了一些代码:

//qml.main
import QtQuick 2.4
import QtQuick.Controls 1.3

ApplicationWindow {
id: root
visible: true
menuBar: MenuBar {
Menu {
title: qsTr("File")
MenuItem {
text: qsTr("&Open")
onTriggered: console.log("Open action triggered");
}
MenuItem {
text: qsTr("Exit")
onTriggered: Qt.quit();
}
}
}

property string thisName: "root"

signal rootSays(string broadcastMessage)

function callRoot(message) {
var response = message
print("Root received: " + message)
print("Root broadcasting: " + response)
rootSays(response)
}

MajorComponent{//this is root's child A
property string thisName: "A"
thisModel: [{name:"First Grandchild of A", color:"red", y:0},
{name:"Second Grandchild of A", color:"green", y:80}]
}

MajorComponent{//this is root's child B
property string thisName: "B"
thisModel: [{name:"First Grandchild of B", color:"blue", y:210},
{name:"Second Grandchild of B", color:"yellow", y:290}]
}


}


//qml.MinorComponent
import QtQuick 2.0

Rectangle {
property string thisName: ""
property string thisColor: ""

color: thisColor
height: 50; width: 200
Text {
anchors.centerIn: parent
text: thisName
}

MouseArea {
anchors.fill: parent
onClicked: {
print(thisName + " clicked")
print("Root called with: " + thisName)
root.callRoot("Hello from " + thisName)
print("---")
}
}
}


//qml.MajorComponent
import QtQuick 2.0

Rectangle {
property var thisModel: []

Repeater {
model:thisModel
MinorComponent {
y: modelData.y
thisName: modelData.name
thisColor: modelData.color
function handleResponse(response) {
print(thisName + " received: " + response);
}
Connections {
target: root
onRootSays: handleResponse(broadcastMessage)
}

}
}

}

最佳答案

I don't think id's can be set dynamically, not even once at creation; am I wrong about that?

id 是纯粹的“编译”时间构造。也就是说,没有什么能阻止您实现和管理您自己的对象注册系统。一个简单的空 JS 对象就可以了,它可以有效地用作 QMap 以根据键(属性名称)查找对象。如果您将 map 对象设置为根对象的属性,由于动态作用域,它应该可以从树中的每个对象解析。

使用信号的方法在 IMO 中是一种可靠的方法。我使用了类似的东西,结合仿函数和引用捕获,允许访问任意树结构中的任意和可选的现有对象,根据他们必须满足的各种标准过滤候选人。您可以使用此技术做一些非常棘手的事情。

话虽如此,一个说明您实际想要实现的目标的实际示例将有助于提供更具体的答案。

关于qt - QML 在匿名孙子之间发送信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37778354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com