PyQt5 QTreeWidge(一)一个QTreeWidget 获得checked(复选框)的item,并实现另一个QTreeWidget展现出来,并不重复

博客介绍了实现两个QTreeWidget之间交互的方法。treeView_add_fjg使用复选选项可多选,点击“添加”按钮能将选中的checked内容添加到self.treeView_usable中,点击“清除”可删除已选内容,还说明了获取checked复选框信息及列数据的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了实现两个QTreeWidget之间的交互,treeView_add_fjg使用复选选项,可以多选,点击“添加”按钮,将选择的checked内容,添加到self.treeView_usable中,点击“清除”,可以删除已经选择的内容

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
dict_1 = {'#01号车间': ['QJ_01_1', 'QJ_01_2', 'QJ_01_3', 'QJ_01_4', 'QJ_01_5', 'QJ_01_6', 'QJ_01_7', 'QJ_01_8', 'QJ_01_9', 'QJ_01_10'], '#02号车间': ['QJ_02_1', 'QJ_02_2', 'QJ_02_3', 'QJ_02_4', 'QJ_02_5', 'QJ_02_6', 'QJ_02_7', 'QJ_02_8', 'QJ_02_9', 'QJ_02_10'], '#03号车间': ['QJ_03_1', 'QJ_03_2', 'QJ_03_3', 'QJ_03_4', 'QJ_03_5', 'QJ_03_6', 'QJ_03_7', 'QJ_03_8', 'QJ_03_9', 'QJ_03_10']}
list_add= {}
list_add_clumon = []
class window(QWidget):
    def __init__(self):
        super(window,self).__init__()
        self.resize(800,800)
        self.setWindowTitle("wwww")
        self.verh = QHBoxLayout(self)
        self.treeView_add_fjg = QTreeWidget(self)
        self.treeView_add_fjg.setColumnCount(2)
        self.treeView_add_fjg.setHeaderLabels(["发酵罐","状态"])#设置标题
        self.treeView_add_fjg.setColumnWidth(0,150)#设置列宽

        self.root=QTreeWidgetItem(self.treeView_add_fjg)
        self.root.setText(0,"可用发酵罐")
        self.root.setIcon(0,QIcon("../image/add_one_f.png"))
        for i in dict_1.keys():
            child1 = QTreeWidgetItem(self.root)
            child1.setText(0,i)
            child1.setIcon(0,QIcon("../image/cj2.png"))
            child1.setText(1,str(len(dict_1[i]))+"个可使用")
            for j in dict_1[i]:
                self.child2 = QTreeWidgetItem(child1)
                self.child2.setText(0,str(j))
                self.child2.setIcon(0,QIcon("../image/image_fajiao.png"))
                self.child2.setText(1,"可使用")
                self.child2.setCheckState(0, not Qt.CheckState)
                # self.child2.checkState(0)
        self.treeView_add_fjg.expandAll()
        self.verh.addWidget(self.treeView_add_fjg)
        self.btns_add = QPushButton(self)
        self.btns_add.setText("增加")
        self.verh.addWidget(self.btns_add)
        self.btns_del = QPushButton(self)
        self.btns_del.setText("减少")
        self.verh.addWidget(self.btns_del)

        self.treeView_usable = QTreeWidget(self)
        self.verh.addWidget(self.treeView_usable)

        # self.treeView_add_fjg.clicked.connect(self.onclick)
        self.treeView_add_fjg.itemChanged.connect(self.onclick)
        self.btns_add.clicked.connect(self.add_fjg)
    def add_fjg(self):
        self.treeView_usable.clear()
        self.root_1 = QTreeWidgetItem(self.treeView_usable)
        self.root_1.setText(0, "已选择的发酵罐")
        self.root_1.setIcon(0, QIcon("../image/add_one_f.png"))
        self.treeView_usable.destroy()
        self.treeView_usable.setColumnCount(1)
        for i in list_add:
            child1 = QTreeWidgetItem(self.root_1)
            child1.setText(0, i)
            child1.setIcon(0, QIcon("../image/image_fajiao_add.png"))
            child1.setText(1, "已选择")
        self.treeView_usable.expandAll()
    def onclick(self,item,cloumn):
        if item.checkState(cloumn) == Qt.Checked:
            print("checked", item.text(0),item.text(1))
            list_add[item.text(0)]=item.text(0)
            list_add_clumon.append(self.treeView_add_fjg.currentColumn())
        if item.checkState(cloumn) == Qt.Unchecked:
            print("unchecked", item.text(0))
        print(list_add)
        print(list_add_clumon)
if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    fjg_gl = window()
    fjg_gl.show()
    sys.exit(app.exec_())


使用item.checkstate(cloumn)==Qt.Checked获取checked复选框的信息:

其中item.text(0)获取第一列的数据,item.text(1)获取第二列的数据

def onclick(self,item,cloumn):
        if item.checkState(cloumn) == Qt.Checked:
            print("checked", item.text(0),item.text(1))
            list_add[item.text(0)]=item.text(0)
            list_add_clumon.append(self.treeView_add_fjg.currentColumn())
        if item.checkState(cloumn) == Qt.Unchecked:
            print("unchecked", item.text(0))
        print(list_add)
        print(list_add_clumon)

效果如图所示

 

### 创建带复选功能的下拉框获取用户选择 在 PyQt5 中,默认情况下 `QComboBox` 不支持多选操作。然而,可以通过自定义实现一个多选下拉框的功能。具体来说,可以利用 `QDialog` 或者 `QWidget` 来模拟一个带有复选框的弹窗作为下拉菜单的内容。 以下是完整的解决方案: #### 自定义多选下拉框类 通过继承 `QComboBox` 和嵌入 `QListWidget` 实现多选功能,提供接口来设置和读取选项。 ```python from PyQt5.QtWidgets import ( QApplication, QComboBox, QListWidgetItem, QDialog, QVBoxLayout, QPushButton, QWidget, QListWidget, QMessageBox ) class MultiSelectComboBox(QComboBox): def __init__(self, parent=None): super().__init__(parent) self.list_widget = QListWidget() self.setPopup(self.list_widget) # 设置下拉部分为 QListWidget self.addItem("请选择") # 默认占位符 self.setModel(self.list_widget.model()) # 绑定模型到组合框 self.setView(self.list_widget) # 绑定视图到组合框 self.list_widget.itemChanged.connect(self.updateText) # 更新显示文字 def addItemsWithCheckboxes(self, items): """ 添加带有复选框的项目 """ for item in items: list_item = QListWidgetItem(item) list_item.setFlags(list_item.flags() | Qt.ItemIsUserCheckable) # 启用可勾选属性 list_item.setCheckState(Qt.Unchecked) # 初始状态未勾选 self.list_widget.addItem(list_item) def updateText(self): """ 更新当前显示的文字为已选中的项 """ selected_items = [ self.list_widget.item(i).text() for i in range(self.list_widget.count()) if self.list_widget.item(i).checkState() == Qt.Checked ] self.setCurrentText(", ".join(selected_items)) def getSelectedItems(self): """ 返回所有被选中的项 """ return [ self.list_widget.item(i).text() for i in range(self.list_widget.count()) if self.list_widget.item(i).checkState() == Qt.Checked ] # 主窗口示例代码 class MainWindow(QWidget): def __init__(self): super().__init__() layout = QVBoxLayout() self.combo_box = MultiSelectComboBox() self.combo_box.addItemsWithCheckboxes(["选项", "选项二", "选项三"]) # 添加多个选项 layout.addWidget(self.combo_box) button = QPushButton("获取选择") button.clicked.connect(self.on_button_click) layout.addWidget(button) self.setLayout(layout) def on_button_click(self): """ 按钮点击事件处理函数 """ selected_items = self.combo_box.getSelectedItems() message = f"您选择了: {', '.join(selected_items)}" if selected_items else "没有任何选择" QMessageBox.information(self, "选择结果", message) if __name__ == "__main__": app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` --- ### 功能说明 1. **MultiSelectComboBox 类** - 使用 `QListWidget` 提供了一个内置列表区域,在其中动态添加了具有复选框特性的条目[^1]。 - 当用户改变某个项目的勾选状态时,触发信号更新顶部展示的文本内容。 2. **MainWindow 类** - 构建了一个简单的界面,包含上述自定义组件以及一个按钮用于测试逻辑。 - 用户点击按钮后会调用回调函数提取当前已被勾选的所有条目名称,将其反馈给用户。 3. **扩展能力** 可以进步调整样式或者增加更多交互行为,比如限制最多能选几个、自动滚动定位等特性[^3]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值