gpt4 book ai didi

qt - 如何声明多个 QML 属性而不单独处理每个属性?

转载 作者:行者123 更新时间:2023-12-04 13:27:25 26 4
gpt4 key购买 nike

我有一个玩具 QML 应用程序(Qt 5.7),它由以下 QML 页面和一些 C++ 代码组成,这些代码允许 QML 订阅音频设备上的某些状态并在 QML GUI 中反射(reflect)该状态。玩具 QML 看起来像这样:

import QtQuick 2.6
import QtQuick.Controls 1.5
import QtQuick.Window 2.2

Item {
id: deviceState

property bool mute1: false
property bool mute2: false
property bool mute3: false
property bool mute4: false

Component.onCompleted: {
// Call out to C++ land, to tell the server what
// control points we are interested in tracking the state of
topLevelWindow.subscribeToControlPoints("Input 1-4 Mute", deviceState);
}

// Called by C++ land to tell us the current state of
// a control point we previously subscribed to.
function onControlPointValueUpdated(address, value) {
if (address == "Input 1 Mute") {
mute1 = value
}
else if (address == "Input 2 Mute") {
mute2 = value
}
else if (address == "Input 3 Mute") {
mute3 = value
}
else if (address == "Input 4 Mute") {
mute4 = value
}
}

// Absurdly minimalist example GUI
Text {
text: parent.mute4 ? "MUTED" : "unmuted"
}
}

当我运行此程序时,只要我的音频设备上的四个静音状态之一发生更改,我的 C++ 代码就会调用 onControlPointValueUpdated(),并且基于调用中的“地址”参数,四个 muteN QML 属性之一发生更改。而且,每当 mute4 属性更改时,文本区域中的文本都会更新以反射(reflect)这一点。

就目前而言,这一切都很好,但在某些时候我需要扩大规模;特别是我将需要跟踪成百上千个值,而不仅仅是四个,并且必须为每个值手动声明一个单独的、手工命名的 QML 属性很快就会变得很困难并且难以维护;如果必须手动 if/elseif 遍历每个属性,onControlPointValueUpdated() 的实现将变得非常低效。

所以我的问题是,在 QML 中是否有某种方法可以让我声明一个属性数组(或者更好的是一个字典/映射),以便我可以一次声明大量 QML 属性?即是这样的:
property bool mutes[256]: {false}   // would declare mutes[0] through mutes[255], all default to false

...或者如果没有,是否有其他推荐的方法来在 QML 文档中保存大量可观察状态?我喜欢让我的 GUI 小部件绑定(bind)到 QML 属性以在必要时自动更新的能力,但似乎 QML 属性可能不打算被大量使用?

最佳答案

经过一番搜索,似乎最适合我当前需求的机制是 QQmlPropertyMap 类(class)。

特别是,我添加了 QQmlPropertyMap给我的QQmlContext ,并通过 setContextProperty() 将其公开给 QML 世界:

_sessionContext = new QQmlContext(_engine.rootContext());
_propertyMap = new QQmlPropertyMap(_sessionContext);
_sessionContext->setContextProperty("cps", _propertyMap);

...然后当我在 C++ 代码中收到值更新时,我没有调用 QML 函数,而是用它更新 QQmlPropertyMap 对象:
_propertyMap->insert("input_4_mute", QVariant(true));  // arguments hard-coded here for clarity

...并且QML代码中剩下要做的就是绑定(bind)到属性但是我想:
Rectangle {
width: 0; height: 0
x:160; y:120
color: cps.input_4_mute ? "red" : "blue"
}

关于qt - 如何声明多个 QML 属性而不单独处理每个属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38251554/

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