2012-05-17 5 views
0

Я показываю несколько QLabels на QFrame, помещенный в QScrollArea.Как узнать, виден ли дочерний виджет QScrollArea?

Я могу сказать QScrollArea сделать любого из QLabels видимых с QScrollArea.ensureWidgetVisible(QLabel), но я не могу найти способ, чтобы выяснить, является ли сейчас видимым или нет дочернего виджет. Я бы ожидал чего-то вроде QScrollArea.isWidgetVisible(QWidget).

Я попытался с помощью собственного метода ребенка, т.е. QLabel.isVisible(), но независимо от того, отображается ли QLabel или нет в QScrollArea, он всегда возвращает True (смотри пример ниже). Каково решение этого?

#!/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 должен вернуть виджет виден или нет. Это не отличается от того, что я сделал в приведенном выше коде, где я вернул все дочерние виджеты, и который не работает, поскольку он возвращает True для всех виджетов, даже если они не видны в QScrollArea. – Benjamin

Смежные вопросы