【问题标题】:Reconfiguring QML controls programatically以编程方式重新配置 QML 控件
【发布时间】:2021-03-10 07:54:47
【问题描述】:

所以,我正在开发一个 Qt Quick (QML) 应用程序,我有这个特殊的任务:

该应用将处理不同类型的设备,并且并非所有设备都具有相同的特性。例如,由于这些是 SDR 设备,一个可能需要一个增益滑块,而另一个需要 3 个独立的。

后端将读取设备并了解以下信息:有多少阶段以及它们的范围是多少。所以我需要我的视图来根据需要创建/销毁/重新调整滑块。

实现这种想法的最简洁的方法是什么?似乎非常不鼓励直接从 C++ 访问 QML 元素。

【问题讨论】:

  • 使用中继器 qml
  • 带有 QAbstractListModel 和每个滑块的项目。或者可选的 QList,但这有点难看(并且 QList 不能被引擎转换为 QML)

标签: c++ qt qml qt-quick


【解决方案1】:

这里没有太多信息可以提供,所以我的答案将主要是未经测试的伪代码。

阅读您的评论后更新答案:

我将有一个 DeviceManager 来存储每个插入的设备的列表。DeviceModel 将监听该列表中的更改,并公开一个 device 角色(您也可以为每个属性设置一个角色设备)。创建一个代表每个设备的公共部分的DeviceUI.qml,并在其中有一个Repeater,如提到的@eyllanesc,以枚举由DeviceGainModel 表示的每个“增益”类型:

// DeviceUi.qml
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 2.15

GroupBox {
    id: root
    title: device.displayName

    required property var device

    ColumnLayout {
        anchors.fill: parent

        Repeater {
            model: DeviceGainModel {
                device: root.device
            }
            delegate: RowLayout {
                Label {
                    text: model.gainDisplayName
                }
                Slider {
                    value: model.gain
                    onMoved: model.gain = value
                }
            }
        }
    }
}

// main.qml
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 2.15

import MyApp 1.0

ApplicationWindow {
    id: window
    width: 640
    height: 480
    visible: true

    required property DeviceManager deviceManager

    ColumnLayout {
        Repeater {
            model: DeviceModel {
                deviceManager: window.deviceManager
            }
            delegate: DeviceUi {
                // Set via model roles.
                required property var device
            }
        }
    }
}

这样,您的域逻辑对 UI 一无所知(即不从 C++ 访问 QML)。

【讨论】:

  • 谢谢!这是一个很好的开始。但是,我有一个额外的要求。我正在使用一个“通用”库,它将一个字符串作为输入,因此可能的设备数量是“不可数的”。大多数东西都很常见,但实际上是滑块的数量非常多。所以我真的需要像“打开设备->读取设备(都在c++中)->告诉QML有多少滑块和范围”之类的东西,我不能只用加载器来解释所有这些。
  • 好的,那么它会是类似的,但所有设备都有一个 UI,并且该 UI 中的模型表示可变数量的滑块。
【解决方案2】:

一般来说,配置总是有一些必须具备的确定特性:

  • 每个项目或对象都可以访问
  • 广播更改事件
  • 独立于消费者
  • 默认值 ...

根据我们的个人经验,我们总是创建一个 c++ 单例对象并创建配置值属性(QProperty)并将它们作为上下文属性(QQmlContext::setContextProperty())发送到 QML 引擎。 所有 QML 项都绑定在自己的属性上。当必须更改配置值时,所有项目都可以知道此更改并在此之后自行更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-05
    • 2023-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    相关资源
    最近更新 更多