2017-01-25 19 views
1

我有一個QScrollArea其中有很多小部件。如何檢測小部件是否在視線內? PyQt

我無法找到一種方式來檢測滾動後看到哪些小部件。
有沒有辦法在滾動後檢測哪些小部件在視線之內?

+0

不熟悉Python,但我會檢查當前的X和Y的位置滾動條和計算哪個區域被覆蓋使用該值。之後,您可以使用此區域來檢查組件是否在其中。可能有很多東西需要這樣做,但這也許是我會這麼做的 – geisterfurz007

回答

1

如果你想知道哪些部件是可見的,使用此功能:

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

如果您只想檢測移動滾動必須通過使用所產生的信號:

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

在該示例使用valueChanged信號

示例:

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

輸出:

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

enter image description here

輸出:

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