2017-01-25 3 views
1

Ich habe eine QScrollArea mit vielen Widgets drin.Wie erkenne ich, ob ein Widget in Sichtweite ist? PyQt

Ich konnte keinen Weg finden zu erkennen, welche Widgets nach Scroll sichtbar sind.
Gibt es eine Möglichkeit zu erkennen, welche Widgets nach scroll sichtbar sind?

+0

Nicht vertraut mit Python, aber ich würde die aktuellen X- und Y-Positionen der Check Scrollbalken und berechnen Sie, welcher Bereich abgedeckt ist Verwenden Sie diese Werte. Danach können Sie in diesem Bereich prüfen, ob eine Komponente darin enthalten ist oder nicht. Möglicherweise zu viel, um das zu tun, aber so würde ich es vielleicht machen – geisterfurz007

Antwort

1

Wenn Sie möchten wissen, welche Widget sichtbar Nutzung dieser Funktion:

def isVisibleWidget(widget): 
    if not widget.visibleRegion().isEmpty(): 
     return True 
    return False 

Wenn Sie nur die Bewegung der Scroll erfassen möchten, dass Sie die Signale, die von erzeugt verwenden müssen:

{your QScrollArea}.verticalScrollBar() 
{your QScrollArea}.horizontalScrollBar() 

In das Beispiel verwenden, um das Signal valueChanged

Beispiel:

import sys 

from PyQt5.QtWidgets import QApplication, QPushButton, QScrollArea, QVBoxLayout, QWidget 


class Widget(QWidget): 
    def __init__(self, parent=None): 
     super(Widget, self).__init__(parent=parent) 

     widget = QWidget() 
     layout = QVBoxLayout(self) 
     self.buttons = [] 
     for i in range(20): 
      btn = QPushButton(str(i)) 
      self.buttons.append(btn) 
      layout.addWidget(btn) 
     widget.setLayout(layout) 
     scroll = QScrollArea() 
     scroll.setWidget(widget) 

     vLayout = QVBoxLayout(self) 
     vLayout.addWidget(scroll) 
     self.setLayout(vLayout) 

     scroll.verticalScrollBar().valueChanged.connect(self.slot) 
     scroll.horizontalScrollBar().valueChanged.connect(self.slot) 
     self.show() 
     self.slot() 

    def slot(self): 
     visibles = [] 
     for btn in self.buttons: 
      if self.isVisibleWidget(btn): 
       visibles.append(btn.text()) 
     print(visibles) 

    def isVisibleWidget(self, widget): 
     if not widget.visibleRegion().isEmpty(): 
      return True 
     return False 


if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    w = Widget() 
    sys.exit(app.exec_()) 

enter image description here

Ausgang:

['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13'] 

enter image description here

Ausgang:

['6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19'] 
Verwandte Themen