2

在下面的屏幕截图中,QListWidget随机填充了许多QListWIdgetItems,已wordWrap启用,scrollBar右侧带有 a(注意所选项目)。

我所追求的是每个(可见)QListWidgetItem相对于QListWidget.viewport().

到目前为止,我通过在 y 范围内行走来实现这一点,QListWidget.viewport().geometry()像素距离等于行高(这里:29 像素),将 aitemAt(0,y)应用于 theQListWidget并将 fount 项目附加到列表中,如果它们还没有在它。

代码就像:

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 坐标?

在此处输入图像描述

4

1 回答 1

1

您可以获取模型索引的列表,然后遍历它们并调用QListWidget.visualRect以获取项目/索引在本地视口坐标中的位置

for row in range(listwidget.count()):
    index = listwidget.model().index(row)
    rect = listwidget.visualRect(index)
    print rect.y()
于 2016-11-09T18:23:22.780 回答