如何获取QTreeWidget可见区域中显示的所有项目?

2024-06-11 11:50:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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

enter image description here

在您看到的第一张图像中,我希望获得可见区域中的所有项目。在第二幅图中,我改变了滚动条,可见区域中的项目也改变了。所以我想在滚动时按可见区域获取所有项目

enter image description here


Tags: 项目图像区域部件树形
1条回答
网友
1楼 · 发布于 2024-06-11 11:50:18

一种相当有效的方法是使用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_())

相关问题 更多 >