PyQt 导出当前在 QListWidget 中可见的 QListWidgetItems 的 y 像素坐标
PyQt derive y pixel coordinates of QListWidgetItems currently visible in a QListWidget
在下面的屏幕截图中是一个 QListWidget
随机填充,其中启用了许多 QListWIdgetItems
、wordWrap
,并且在右侧有一个 scrollBar
(注意选择的项目).
我想要的是每个(可见)QListWidgetItem
相对于 QListWidget.viewport()
的 y 位置。
到目前为止,我通过以等于行高(此处:29 像素)的像素距离遍历 QListWidget.viewport().geometry()
的 y 范围,将 itemAt(0,y)
应用到QListWidget
并将字体项添加到列表中(如果列表中尚未准备好)。
代码如下:
def reportItems(self):
l = self.listWidget
dy = l.item(0).font().pointSize()
ystart = l.viewport().geometry().y()
h = l.viewport().geometry().height()
print ystart, h, dy
itlist = []
itcomplist = []
for y in range(ystart, ystart+h, (29/8)*dy): #empirical value
i = l.itemAt(0, y)
if not i in itlist:
itlist.append(i)
itcomplist.append((y, l.row(i)))
for it in itcomplist:
y, i = it
print y, l.item(i).text()[:30]
这种方式对我来说似乎不是很优雅,因为它很慢并且执行冗余查询。
有没有更聪明的方法来找到所有的 y 坐标?
您可以获得模型索引列表,然后遍历它们并调用 QListWidget.visualRect
以获取 item/index 在本地视口坐标
中的位置
for row in range(listwidget.count()):
index = listwidget.model().index(row)
rect = listwidget.visualRect(index)
print rect.y()
在下面的屏幕截图中是一个 QListWidget
随机填充,其中启用了许多 QListWIdgetItems
、wordWrap
,并且在右侧有一个 scrollBar
(注意选择的项目).
我想要的是每个(可见)QListWidgetItem
相对于 QListWidget.viewport()
的 y 位置。
到目前为止,我通过以等于行高(此处:29 像素)的像素距离遍历 QListWidget.viewport().geometry()
的 y 范围,将 itemAt(0,y)
应用到QListWidget
并将字体项添加到列表中(如果列表中尚未准备好)。
代码如下:
def reportItems(self):
l = self.listWidget
dy = l.item(0).font().pointSize()
ystart = l.viewport().geometry().y()
h = l.viewport().geometry().height()
print ystart, h, dy
itlist = []
itcomplist = []
for y in range(ystart, ystart+h, (29/8)*dy): #empirical value
i = l.itemAt(0, y)
if not i in itlist:
itlist.append(i)
itcomplist.append((y, l.row(i)))
for it in itcomplist:
y, i = it
print y, l.item(i).text()[:30]
这种方式对我来说似乎不是很优雅,因为它很慢并且执行冗余查询。
有没有更聪明的方法来找到所有的 y 坐标?
您可以获得模型索引列表,然后遍历它们并调用 QListWidget.visualRect
以获取 item/index 在本地视口坐标
for row in range(listwidget.count()):
index = listwidget.model().index(row)
rect = listwidget.visualRect(index)
print rect.y()