2017-01-25 1 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'] 
Смежные вопросы