2012-05-17 2 views
0

QScrollArea에 배치 된 QFrame에 복수 QLabels을 표시했습니다.QScrollArea의 하위 위젯이 표시되는지 확인하는 방법은 무엇입니까?

나는 QScrollArea.ensureWidgetVisible(QLabel)로 볼 수 QLabels 중 하나를 만들기 위해 QScrollArea 말할 수 있어요,하지만 난 자식 위젯이 현재 표시 여부 찾을 수있는 방법을 찾을 수 없습니다. 나는 QScrollArea.isWidgetVisible(QWidget)과 같은 것을 기대할 것이다.

내가 QLabel가 보이는 여부 QScrollArea에, 항상 True을 반환하는지 여부 아이의 자신의 방법, 즉 QLabel.isVisible()하지만 상관없이 사용하여 시도 (아래 예 참조). 이것에 대한 해결책은 무엇입니까?

#!/usr/bin/env python 

import sys 
from PyQt4 import QtGui, QtCore 



application = QtGui.QApplication(sys.argv) 

class Area(QtGui.QScrollArea): 

    def __init__(self, child): 
      super(Area, self).__init__() 
     self.child = child 
     self.setWidget(self.child) 
     self.setFixedSize(100, 100) 


class MainWidget(QtGui.QFrame): 

    def __init__(self, parent=None): 
      QtGui.QFrame.__init__(self, parent) 
     self.layout = QtGui.QVBoxLayout() 
     n = 1 
     while n != 10: 
      label = QtGui.QLabel('<h1>'+str(n)+'</h1>') 
      self.layout.addWidget(label) 
      n += 1 
     self.setLayout(self.layout) 

    def wheelEvent(self, event): 
     print "Wheel Event:" 
     for child in self.children()[1:]: 
      print child.isVisible() 
     event.ignore() 

mainwidget = MainWidget() 
area = Area(mainwidget) 
area.show() 
application.exec_() 

답변

2

isVisible은 사용자가 원하는 것과 다릅니다. 위젯이 숨겨져 있는지 여부를 알려줍니다. 뷰포트에 있지 않더라도 hide이 없으면 위젯이 표시됩니다.

visibleRegion을 사용할 수 있습니다. 페인트 이벤트가 발생해야하는 위젯 영역입니다. 레이블이 뷰포트 외부에 있으면 영역이 빈 영역이어야합니다.

def wheelEvent(self, event): 
    print "Wheel Event:" 
    for child in self.children()[1:]: 
     print child.text(), 'is visible?', not child.visibleRegion().isEmpty() 
    event.ignore() 
+0

완벽! 고맙습니다 :) – Benjamin

0

QScrollArea::ensureWidgetVisible이됩니다.

QSCrollArea::childAt (int x, int y).isvisble()을 사용하면 위젯 표시 여부를 확인할 수 있습니다.

+0

QScrollArea.ensureWidgetVisible은 위젯이 보이도록 이동합니다. 처음에는 위젯이 표시되는지 여부를 알려주지 않습니다. QScrollArea.childAt는 지정된 위치에서 위젯을 반환하기 만하면 QWidget.isVisible은 위젯이 표시되는지 여부를 반환해야합니다. 이는 QScrollArea에서 보이지 않더라도 모든 위젯에 대해 True를 반환하므로 모든 위젯을 반환하고 작동하지 않는 위 코드에서 수행 한 것과 다르지 않습니다. – Benjamin

관련 문제