2016-11-09 1 views
2

in der Abbildung unten ist ein QListWidget zufällig mit vielen QListWIdgetItems bevölkerte, wordWrap aktiviert und mit einem scrollBar auf der rechten Seite (man beachte das ausgewählte Element).PyQt ableiten y Pixelkoordinaten von QListWidgetItems aktuell sichtbaren in einem QListWidget

Was ich bin sind die Y-Positionen von jedem (sichtbar) QListWidgetItem relativ zu QListWidget.viewport().

Inzwischen erreiche ich dies durch an die Zeilenhöhe über den y-Bereich der QListWidget.viewport().geometry() mit einem Pixelabstand äquivalent Fuß (hier: 29 Pixel), einen itemAt(0,y) zum QListWidget Anwendung und die Quelle von Elementen zu einer Liste anhang wenn sie nicht schon drin sind.

Code ist wie:

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] 

Auf diese Weise mir nicht sehr elegant scheint, da es langsam ist und redundante Abfragen durchführt.

Gibt es eine klügere Möglichkeit, alle y-Koordinaten zu finden?

enter image description here

Antwort

1

Sie eine Liste der Modell Indizes bekommen können, dann über sie Schleife und rufen QListWidget.visualRect den Speicherort des Elements/Index in lokalen Ansichtsfenster zu bekommen Koordinaten

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