【问题标题】:How to get all items shown in the visible region of a QTreeWidget?如何获取 QTreeWidget 可见区域中显示的所有项目?
【发布时间】:2021-05-13 05:36:00
【问题描述】:

我正在制作一个树形小部件,我希望在滚动时仅获取可见区域中存在的所有项目(不是树形小部件中存在的所有项目) - 如下图所示:

如您所见,在第一张图片中,我想获取可见区域中存在的所有项目。在第二张图片中,我更改了滚动条,可见区域中的项目也发生了变化。所以我想在滚动时根据可见区域获取所有项目。

【问题讨论】:

    标签: python pyqt pyqt5 qtreeview qtreewidget


    【解决方案1】:

    一种相当有效的方法是使用indexAt 获取视口顶部和底部的索引,然后根据行号创建一个范围:

    def visibleRange(self):
        top = QtCore.QPoint(0, 0)
        bottom = self.tree.viewport().rect().bottomLeft()
        return range(self.tree.indexAt(top).row(),
                     self.tree.indexAt(bottom).row() + 1)
    

    然后您可以对其进行迭代以从每一行中提取您需要的任何信息。这是一个完整的演示脚本:

    import sys
    from PyQt5 import QtCore, QtWidgets
    
    class Window(QtWidgets.QWidget):
        def __init__(self):
            super().__init__()
            self.button = QtWidgets.QPushButton('Test')
            self.button.clicked.connect(self.handleButton)
            self.tree = QtWidgets.QTreeWidget()
            layout = QtWidgets.QVBoxLayout(self)
            layout.addWidget(self.tree)
            layout.addWidget(self.button)
            columns = 'ABCDE'
            self.tree.setColumnCount(len(columns))
            for index in range(100):
                QtWidgets.QTreeWidgetItem(
                    self.tree, [f'{char}{index:02}' for char in columns])
    
        def visibleRange(self):
            top = QtCore.QPoint(0, 0)
            bottom = self.tree.viewport().rect().bottomLeft()
            return range(self.tree.indexAt(top).row(),
                         self.tree.indexAt(bottom).row() + 1)
    
        def handleButton(self):
            for row in self.visibleRange():
                item = self.tree.topLevelItem(row)
                print(item.text(0))
    
    if __name__ == '__main__':
    
        app = QtWidgets.QApplication(sys.argv)
        window = Window()
        window.setWindowTitle('Test')
        window.setGeometry(800, 100, 540, 300)
        window.show()
        sys.exit(app.exec_())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多