2016-11-09 23 views
2

В приведенном ниже скриншоте является QListWidget случайным образом заполняется многими QListWIdgetItems, wordWrap включен, и с scrollBar на правой стороне (обратите внимание на выбранный элемент).PyQt получить у пиксельных координат QListWidgetItems в настоящее время видны в QListWidget

То, что мне нужно, - это позиции y каждого (видимого) QListWidgetItem относительно QListWidget.viewport().

К настоящему времени, я могу добиться этого, идя по у-диапазона QListWidget.viewport().geometry() с расстоянием пикселей, эквивалентной высоту строки (здесь: 29 пикселей), применяя 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?

enter image description here

ответ

1

Вы можете получить список модельных индексов, а затем цикл над ними и вызвать QListWidget.visualRect, чтобы получить расположение элемента/индекса в локальной координатах области просмотра

for row in range(listwidget.count()): 
    index = listwidget.model().index(row) 
    rect = listwidget.visualRect(index) 
    print rect.y()