QML 将CheckBox添加到一个组,同一时间只能勾选一个,具有排他性

效果:

需要使用到 ButtonGroup 部件;

exclusive 属性需要设置为true,保持组中的按钮的排他性,有且只能选中一个按钮;

buttons 属性,给其赋值 list<AbstractButton> 参数即可将按钮组组合到一起;

使用一个布局类的children属性也可以实现;

// 按钮的组
ButtonGroup {
    id: childGroup

    // 保持组中的按钮的排他性,有且只能选中一个按钮
    exclusive: true
    buttons: col.children    // 使用方式2的话,这里可以注释掉
}


// 垂直属性
Column {
    id: col
    CheckBox {
        text: "first checkbox"
        checked: true   // 设置是否勾选
        //ButtonGroup.group: childGroup    // 方式2,也可以这样添加到组里
    }
    CheckBox {
        text: "second checkbox"
        checked: false   // 设置是否勾选
        //ButtonGroup.group: childGroup    // 方式2,也可以这样添加到组里
    }
    CheckBox {
        text: "third checkbox"
        checked: false   // 设置是否勾选
        //ButtonGroup.group: childGroup    // 方式2,也可以这样添加到组里
    }
}

也可以在CheckBox中直接添加到组里,ButtonGroup.group: childGroup

CheckBox 的 tristate 可以设置是否启用三种状态;

Qt.Unchecked                  0 没勾选
Qt.PartiallyChecked           1  -
Qt.Checked                    2 勾选
CheckBox {
    text: "first checkbox"
    checked: true   // 设置是否勾选

    // 设置为true,checkbox会有三个状态
    tristate: true
    onCheckStateChanged: {
        console.log(checkState)
    }
}

官方案例:

1.通过一个checkbox来控制全部checkbox的勾选

效果:

Column {
    ButtonGroup {
        id: childGroup
        exclusive: false
        checkState: parentBox.checkState
    }

    CheckBox {
        id: parentBox
        text: qsTr("Parent")
        checkState: childGroup.checkState
    }

    CheckBox {
        checked: true
        text: qsTr("Child 1")
        leftPadding: indicator.width
        ButtonGroup.group: childGroup
    }

    CheckBox {
        text: qsTr("Child 2")
        leftPadding: indicator.width
        ButtonGroup.group: childGroup
    }
}

2.可以自己控制勾选状态

效果:

CheckBox {
    tristate: true

    // 可以控制勾选
    nextCheckState: function() {
        // 如果当前时为勾选状态
        if (Qt.Unchecked === checkState) {
            // 返回勾选状态
            return Qt.Checked

        } else if (Qt.Checked === checkState) {
            return Qt.PartiallyChecked

        } else {
            return Qt.Unchecked
        }
    }
}

完!

QML 中动态绑定 `QStringList` 数据到 `ComboBox` 控件,可以通过将 C++ 中的 `QStringList` 类型的数据注册为 QML 可访问的属性,并利用 QML 的绑定机制实现动态更新。以下是实现方法的详细说明。 ### 1. 在 C++ 端定义 `QStringList` 属性并暴露给 QML 首先,需要将包含 `QStringList` 的类注册为 QML 类型。通过使用 `Q_PROPERTY` 将 `QStringList` 暴露为可绑定属性,并通过 `Q_INVOKABLE` 方法允许 QML 调用 C++ 方法来更新数据。 ```cpp #include <QObject> #include <QStringList> class DataModel : public QObject { Q_OBJECT Q_PROPERTY(QStringList items READ items NOTIFY itemsChanged) public: explicit DataModel(QObject *parent = nullptr) : QObject(parent) {} QStringList items() const { return m_items; } Q_INVOKABLE void updateItems(const QStringList &newItems) { if (m_items != newItems) { m_items = newItems; emit itemsChanged(); } } signals: void itemsChanged(); private: QStringList m_items; }; ``` 然后,在主程序中将该类注册到 QML 上下文中: ```cpp DataModel dataModel; engine.rootContext()->setContextProperty("dataModel", &dataModel); ``` ### 2. 在 QML 中绑定 `ComboBox` 在 QML 中,可以通过绑定 `ComboBox` 的 `model` 属性到 C++ 端暴露的 `items` 属性实现动态更新。 ```qml import QtQuick 2.15 import QtQuick.Controls 2.15 ApplicationWindow { visible: true width: 400 height: 300 ComboBox { model: dataModel.items onModelChanged: { console.log("ComboBox items updated") } } Button { text: "Update List" onClicked: { dataModel.updateItems(["Item 1", "Item 2", "Item 3"]) } } } ``` ### 3. 动态更新数据 当调用 `dataModel.updateItems()` 时,`Q_PROPERTY` 会触发 `itemsChanged` 信号,QML 中绑定的 `ComboBox` 会自动更新其内容。[^2] --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值