如何让 QTreeWidget 的可见区域显示所有项目?
How to get all items shown in the visible region of a QTreeWidget?
我正在制作一个树形小部件,我希望在滚动时仅获取可见区域中存在的所有项目(不是树形小部件中存在的所有项目) - 如下图所示:
如您所见,在第一个图像中,我想要获取可见区域中的所有项目。在第二张图片中,我更改了滚动条,可见区域中的项目也发生了变化。所以我想在滚动时根据可见区域获取所有项目。
一个相当有效的方法是使用 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_())
我正在制作一个树形小部件,我希望在滚动时仅获取可见区域中存在的所有项目(不是树形小部件中存在的所有项目) - 如下图所示:
如您所见,在第一个图像中,我想要获取可见区域中的所有项目。在第二张图片中,我更改了滚动条,可见区域中的项目也发生了变化。所以我想在滚动时根据可见区域获取所有项目。
一个相当有效的方法是使用 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_())