Qt复选框互斥

本文介绍了如何在Qt中使用QButtonGroup和QCheckBox实现复选框的互斥选择,并提供了一个取消互斥的方法,通过QObject的信号与槽机制进行连接。
    //复选框互斥
    QButtonGroup *group = new QButtonGroup(this);
    group->addButton(this->ui->checkBox_start_dock,1);
    group->addButton(this->ui->checkBox_stop_task,2);
    group->addButton(this->ui->checkBox_stop_task_4,3);
    group->addButton(this->ui->checkBox_send_dbs,4);

若要再次点击取消选择,可通过“取消互斥-设置状态-互斥”实现。

connect(this->ui->checkBox_start_dock,&QCheckBox::pressed,this,[=](){    
	exclusive(this->ui->checkBox_start_dock,group);});

void MainWindow::exclusive(QCheckBox *box,QButtonGroup *group)
{
    box->setCheckable(true);
    if(box->isChecked()){
        group->setExclusive(false);
        box->setCheckable(false);
        group->setExclusive(true);
    }
}
### 实现QTreeWidget中节点复选框互斥选择 为了实现在`QTreeWidget`中的节点复选框互斥选择功能,可以通过自定义信号槽机制来控制各个节点之间的相互影响。当某个节点被选中时,程序会遍历所有同级以及其他级别的兄弟节点,并取消它们的选择状态。 #### 设置树形控件子项属性 在创建每个`QTreeWidgetItem`实例的时候,应该为其设定特定标志位以及初始未勾选的状态: ```cpp pItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); pItem->setCheckState(0, Qt::Unchecked); // 初始化为未选中状态[^2] ``` 这里需要注意的是移除了`Qt::ItemIsAutoTristate`这一选项,因为三态模式(`Qt::PartiallyChecked`)不符合互斥逻辑的要求。 #### 连接itemChanged信号到处理函数 通过连接`itemChanged()`信号至对应的槽函数,在任何项目发生改变(比如点击了复选框)之后触发该回调函数来进行进一步的操作: ```cpp connect(m_pTreeWidget, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(treeItemChanged(QTreeWidgetItem*, int))); ``` #### 编写treeItemChanged槽函数实现互斥效果 编写具体的业务逻辑用于响应上述事件并完成互斥操作。每当有一个新的条目变为已检查,则将其余所有的条目重置回未检查状态;如果当前条目是从已检查转成未检查,则不做额外动作以免破坏用户的交互意图。 ```cpp void YourClass::treeItemChanged(QTreeWidgetItem *item, int column){ if (column != 0 || !item) return; if(item->checkState(column)==Qt::Checked){ clearOtherItemsSelections(item,column); } } // 辅助方法:清除除指定项外的所有其他项目的选中标记 void YourClass::clearOtherItemsSelections(QTreeWidgetItem* currentItem,int columnIndex){ QTreeWidgetItemIterator it(currentItem->treeWidget()); while (*it){ if ((*it)!=currentItem && (*it)->flags() & Qt::ItemIsUserCheckable){ (*it)->setCheckState(columnIndex,Qt::Unchecked); } ++it; } } ``` 以上代码片段展示了如何利用迭代器遍历整个树结构,并确保每次只保留单个选定条目的方式实现了互斥选择的功能[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值