QComboBox实现复选功能

需求:

  1. 下拉列表有复选功能
  2. 不可编辑
  3. 显示所有选中项

关于QComboBox的复选功能有几种方案:

  1. QStandardItemModel + QStandardItem
  2. QListWidget + QListWidgetItem
  3. Model/View + QItemDelegate

当然,还有其它更好的方式,这里就不再过多介绍了,下面介绍一种比较简单的:

QListWidget + QListWidgetItem + QCheckBox

  pListWidget = new QListWidget(this);
        pLineEdit = new QLineEdit(this);
        for (int i = 0; i < 5; ++i)
    {
        QListWidgetItem *pItem = new QListWidgetItem(pListWidget);
        pListWidget->addItem(pItem);
        pItem->setData(Qt::UserRole, i);
        QCheckBox *pCheckBox = new QCheckBox(this);
        pCheckBox->setText(QStringLiteral("Qter%1").arg(i));
        pListWidget->addItem(pItem);
        pListWidget->setItemWidget(pItem, pCheckBox);
        connect(pCheckBox, SIGNAL(stateChanged(int)), this, SLOT(stateChanged(int)));
    }
        ui.comboBox->setModel(pListWidget->model());
        ui.comboBox->setView(pListWidget);
        ui.comboBox->setLineEdit(pLineEdit);
        pLineEdit->setReadOnly(true);                                                                                                                    //ui.comboBox->setEditable(true);
        connect(pLineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(textChanged(const QString &)));

  

void MultiComboBox::stateChanged(int state)
{
        bSelected = true;
        QString strSelectedData("");
        strSelectedText.clear();
    QObject *object = QObject::sender();
    QCheckBox *pSenderCheckBox = static_cast(object);
    int nCount = pListWidget->count();
    for (int i = 0; i < nCount; ++i)
    {
        QListWidgetItem *pItem = pListWidget->item(i);
        QWidget *pWidget = pListWidget->itemWidget(pItem);
                QCheckBox *pCheckBox = (QCheckBox *)pWidget;
                if (pCheckBox->isChecked())
                {
                        QString strText = pCheckBox->text();
                        strSelectedData.append(strText).append(";");
                }
                //所点击的复选框
        if (pSenderCheckBox == pCheckBox)
        {
                        int nData = pItem->data(Qt::UserRole).toInt();
            qDebug() << QString("I am sender...id : %1").arg(nData);
        }
    }
    if (strSelectedData.endsWith(";"))
        strSelectedData.remove(strSelectedData.count() - 1, 1);
    if (!strSelectedData.isEmpty())
    {
                //ui.comboBox->setEditText(strSelectedData);
                strSelectedText = strSelectedData;
        pLineEdit->setText(strSelectedData);
        pLineEdit->setToolTip(strSelectedData);
    }
        else
        {
                pLineEdit->clear();
                //ui.comboBox->setEditText("");
        }
        bSelected = false;
}

  

void MultiComboBox::textChanged(const QString &text)
{
        if (!bSelected)
                pLineEdit->setText(strSelectedText);
}

当点击的复选框状态改变时候,会发送stateChanged信号,槽中通过sender来获取信号的发送者,然后可以获取所需要的数据(比如:可以通过setData保存一些自定义的数据),遍历所有的复选框,获取选中项的数据进行显示。

中间遇到一个小问题,当点击空白处,下来列表会进行收回,此时QLineEdit的数据将会被自动清空,所以此处判断QLineEdit的textChanged来进行恢复。

效果:

时间: 2024-08-01 21:28:32

QComboBox实现复选功能的相关文章

QComboBox实现复选功能(三种方法:嵌套QListWidget, 设置QStandardItemModel, 设置Delegate)

今天介绍一下一个小东西 — 如何让QComboBox实现复选功能? 需求: 下拉列表有复选功能 不可编辑 显示所有选中项 关于QComboBox的复选功能有几种方案: QStandardItemModel + QStandardItem QListWidget + QListWidgetItem Model/View + QItemDelegate 当然,还有其它更好的方式,这里就不再过多介绍了,下面介绍一种比较简单的: QListWidget + QListWidgetItem + QChec

nz-table复选功能改造(整行可选)

如果你用到了nz-table组件,而且有勾选列表的需求时,就可以用该组件自带的nzShowCheckbox勾选属性,用法如下: <nz-table #rowSelectionTable nzShowPagination nzShowSizeChanger [nzData]="" (nzCurrentPageDataChange)="" > <thead> <tr> <th nzShowCheckbox [(nzChecked

Vue.js小Demo--单选和复选功能实现

Vue官方文档上有单选按钮radio和复选按钮checkbox的例子. 受此启发,写了这个小demo. 演示图: demo.vue文件代码: <div> <div class="Select"> <p class="Title">Single choice</p> <span class="Box" :class="{Selected_active:index == One}&quo

为DataGridView控件实现复选功能

实现效果: 知识运用: DataGridViewCheckBoxColumn类 实现代码: private class Fruit { public int Price { get; set; } public string Name { get; set; } public bool ft; } private List<Fruit> P_fruit; private void Form1_Load(object sender, EventArgs e) { DataGridViewChec

自定义实现复选框

项目中需要用到复选框,而QComboBox只能实现单选操作.即使是加以改造可以多选,也只能一次选择一个选项,不符合项目需求.于是就花了两天时间来自己实现一个可行的复选框. 实现方案:QLineEdit + QListView + QPushButton 第一步是实现类似于QComboBox的显示框. 一个只读的QLineEdit + QPushButton就可以实现.这个QPushButton对象的父指针必须是QLineEdit,这样按钮才能浮在QLineEdit上. 需要根据实现界面大小计算按

自定义实现 PyQt5 下拉复选框 ComboCheckBox

一.前言 由于最近的项目需要具有复选功能,但过多的复选框会影响界面布局和美观,因而想到把 PyQt5 的下拉列表和复选框结合起来,但在 PyQt5 中并没有这样的组件供我们使用,所以想要自己实现一个下拉复选框,主要就是继承 QComboBox 类,然后将复选框 QCheckBox 加入其中,并实现相应的功能. 最终实现的下拉复选框效果如下: 二.代码实现 1.主要方法 在 PyQt5 中,有几个主要的方法需要了解一下,方法名称和对应的含义如下: QtWidgets.QComboBox.setVi

QListWidget的QComboBox下拉列表添加复选框及消息处理

要在QComboBox下拉列表项中添加复选框,并进行消息处理,在网上搜索了很久没有找到太多有用的信息和实际的例子,但从中还是找到了一些提示性的资料,根据这些简短的介绍,最终实现了这个功能. QComboBox有一个setView的方法,因此,可以自定义的一个视图类,将复选框在视图中实现,本例自定义视图类继承于QListWidget,因为在该视图类中,有一个setItemWidget方法,可以直接将QCheckBox附加在QListWidgetItem项上. 具体看下面得的示例: //QCombo

【ztree】完美实现复选框功能

在权限系统中,大多数的页面都用到了树形结构,其中最常用的便是树资源的加载和单击事件,除此之外ztree还可以实现很多功能.今天以实现复选框的添加功能为例,咱们再来深入的学习下ztree的应用. 一.实例描述 在用户管理模块中,需要给用户添加角色,而用户与角色的之间是一个多对多的关系.这里我们可以先加载两个角色树资源,通过两个树之间数据的交换,从而得到用户所拥有的角色资源,实现效果如下: 1.用户信息入口 2.加载角色信息 Datagrid表格中的"分配"按钮是针对单个用户的角色分配,而

checbox复选框实现radio单选框的单选功能

checbox复选框实现radio单选框的单选功能:大家知道复选框可以一次选中多个,单选按钮每次只能够选中其中的一个,但是单选按钮比较霸道,你选中以后,只能够且必须选中其中一个,所有下面就通过checkbox复选框模拟实现单选按钮的功能,但是能够取消选中的项.代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author"