PyQt 导出当前在 QListWidget 中可见的 QListWidgetItems 的 y 像素坐标

PyQt derive y pixel coordinates of QListWidgetItems currently visible in a QListWidget

在下面的屏幕截图中是一个 QListWidget 随机填充,其中启用了许多 QListWIdgetItemswordWrap,并且在右侧有一个 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()