添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

PyQt5: 如何从带有CheckBox的QTreeWidget中获取信号?

1 人关注

我正在学习Pyqt5,但我不能完全理解如何使用信号和槽。

from PySide2.QtWidgets import QApplication, QTreeWidgetItem,QTreeWidget
from PySide2.QtCore import Qt
dat = { 'A':
            { 'A':
                {'1.1': ['1.1.1', '1.1.2'],
                 '1.2': ['1.2.1', '1.2.2']
                {'2.1': ['2.1.1','2.1.2']}
def add(p,ch):
    if isinstance(ch,dict):
        for k,v in ch.items():
            item = QTreeWidgetItem(p)
            item.setText(0, k)
            item.setCheckState(0, Qt.Unchecked)
            item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
            add(item,v)
    else:
        for txt in ch:
            item = QTreeWidgetItem(p)
            item.setText(0, txt)
            item.setCheckState(0, Qt.Unchecked)
            item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
app = QApplication([])
tw = QTreeWidget()
add(tw,dat)
app.show()
app.exec_()

我想检查复选框并返回我选择的节点,但我不知道如何获得信号。 我发现QTreeWidget有一些信号函数,但我不知道如何使用它。 谢谢你的帮助。

python
pyqt5
galaxy42
galaxy42
发布于 2020-03-21
1 个回答
alec
alec
发布于 2020-03-21
已采纳
0 人赞同

你可以连接 QTreeWidget.itemChanged 信号来获得被选中(或未被选中)的QTreeWidgetItem。我把你的代码编辑成一个可查看的GUI。这个例子将只是打印信号发出的QTreeWidgetItem的文本。

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class Template(QWidget):
    def __init__(self):
        super().__init__()
        dat = { 'A':
                    { 'A':
                        {'1.1': ['1.1.1', '1.1.2'],
                         '1.2': ['1.2.1', '1.2.2']
                        {'2.1': ['2.1.1','2.1.2']}
        tw = QTreeWidget()
        tw.itemChanged[QTreeWidgetItem, int].connect(self.get_item)
        grid = QGridLayout(self)
        grid.addWidget(tw)
        self.add(tw, dat)
    def get_item(self, item, column):
        if item.checkState(column) == Qt.Checked:
            print(f'{item.text(column)} was checked')
        else:
            print(f'{item.text(column)} was unchecked')
    def new_item(self, text):
        item = QTreeWidgetItem()
        item.setText(0, text)
        item.setCheckState(0, Qt.Unchecked)
        item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
        return item
    def add(self, p, ch):
        for k, v in ch.items():
            item = self.new_item(k)
            if isinstance(p, QTreeWidget):
                p.addTopLevelItem(item)
            else:
                p.addChild(item)
            if isinstance(v, dict):
                self.add(item, v)
            elif isinstance(v, list):
                for txt in v:
                    item.addChild(self.new_item(txt))
if __name__ == '__main__':