2012-05-17 56 views
0

我在QFrame上顯示多個QLabels,放入QScrollArea如何找出QScrollArea的子部件是否可見?

我能告訴QScrollArea使可見QLabels的任何一個,但我似乎無法找到一個方法來確定子窗口小部件當前是否可見。我期望像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只會移動小部件,使其可見。它不會告訴我該widget是否可見或不在首位。 QScrollArea.childAt只會返回給定位置的小部件,然後QWidget.isVisible應返回小部件是否可見。這與我在上面的代碼中所做的沒有什麼不同,因爲它返回了所有窗口小部件,並且哪些不起作用,因爲它對所有窗口小部件都返回True,即使它們在QScrollArea中不可見。 – Benjamin

相關問題