Pyside6/Qt实现下拉复选框

效果:

源码: 

from PySide6.QtWidgets import QComboBox, QListWidget, QCheckBox, QListWidgetItem, QLineEdit, QApplication, QHBoxLayout, \
    QWidget
from PySide6.QtGui import Qt
from PySide6.QtCore import Signal


# 自定义控件-点击按钮下拉CheckBox列表
class XCombobox(QComboBox):
    # 有item被选择时,发出信号
    itemChecked = Signal(list)
    # 保存QCheckBox控件
    _checks = []

    def __init__(self, parent) -> None:
        super().__init__(parent)
        #   通过setView()设置下拉列表控件,通过setLineEdit替换原有的文本显示控件,并设置为只读模式。预设"全选"选项。
        listwgt = QListWidget(self)
        self.setView(listwgt)
        self.setModel(listwgt.model())
        lineEdit = QLineEdit(self)
        lineEdit.setReadOnly(True)
        self.setLineEdit(lineEdit)
        # 预设'全选'
        self.add_item('全选')

    def add_item(self, text: str):
        #   在这里给每个CheckBox都绑定了信号,目的是每次Check都能作出响应。
        check = QCheckBox(text, self.view())
        check.stateChanged.connect(self.on_state_changed)
        self._checks.append(check)
        item = QListWidgetItem(self.view())
        # 设置item不可选中(只可以被Check)
        item.setFlags(item.flags() & Qt.IntersectsItemShape)
        self.view().addItem(item)
        self.view().setItemWidget(item, check)

    def add_items(self, texts: list):
        for text in texts:
            self.add_item(text)

    def clear(self):
        self.view().clear()

    def get_selected(self):
        sel_data = []
        for chk in self._checks:
            if self._checks[0] == chk:
                continue
            if chk.checkState() == Qt.Checked:
                sel_data.append(chk.text())
        return sel_data

    def set_all_state(self, state):
        for chk in self._checks:
            chk.blockSignals(True)
            chk.setCheckState(Qt.CheckState(state))
            chk.blockSignals(False)

    def on_state_changed(self, state):

        if self.sender() == self._checks[0]:
            self.set_all_state(state)

        sel_data = self.get_selected()
        self.itemChecked.emit(sel_data)
        self.lineEdit().setText(';'.join(sel_data))


def printa(data: list):
    print(data)


if __name__ == '__main__':
    app = QApplication()
    wind = QWidget()
    wind.resize(500, 500)

    cmbox = XCombobox(wind)
    cmbox.add_items(['AAA', 'BBB', 'CCC', 'DDD','AAA', 'BBB', 'CCC', 'DDD','AAA', 'BBB', 'CCC', 'DDD','AAA', 'BBB', 'CCC', 'DDD','AAA', 'BBB', 'CCC', 'DDD','AAA', 'BBB', 'CCC', 'DDD','AAA', 'BBB', 'CCC', 'DDD','AAA', 'BBB', 'CCC', '11DDD'])
    # cmbox.itemChecked.connect(printa)

    hyout = QHBoxLayout(wind)
    hyout.addWidget(cmbox)
    wind.setLayout(hyout)

    wind.show()
    app.exec()

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在PySide6的QTreeView中添加复选框,需要使用QStandardItemModel和QStandardItem类来创建模型和项。然后,将复选框添加到项中并将项添加到模型中。 以下是一个示例代码,展示如何在QTreeView中添加复选框: ```python from PySide6.QtCore import Qt from PySide6.QtGui import QStandardItemModel, QStandardItem from PySide6.QtWidgets import QApplication, QMainWindow, QTreeView class MainWindow(QMainWindow): def __init__(self): super().__init__() # Create the model and set column headers model = QStandardItemModel() model.setHorizontalHeaderLabels(['Name', 'Checked']) # Create some items with checkboxes item1 = QStandardItem('Item 1') item1.setCheckable(True) item2 = QStandardItem('Item 2') item2.setCheckable(True) # Add the items to the model model.appendRow([item1, QStandardItem()]) model.appendRow([item2, QStandardItem()]) # Create the tree view and set the model tree_view = QTreeView() tree_view.setModel(model) # Set the checkbox column to be editable tree_view.setItemDelegateForColumn(1, tree_view.itemDelegateForColumn(0)) # Add the tree view to the main window self.setCentralWidget(tree_view) if __name__ == '__main__': app = QApplication([]) window = MainWindow() window.show() app.exec() ``` 在这个例子中,我们创建了一个QStandardItemModel,然后创建两个带有复选框的QStandardItem。我们将这些项添加到模型中,并将模型设置为QTreeView的模型。最后,我们使用setItemDelegateForColumn方法将复选框列设置为可编辑的,并将QTreeView添加到主窗口中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

立秋6789

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

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

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

打赏作者

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

抵扣说明:

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

余额充值