如何判断QScrollArea的子控件是否可见?

2024-10-01 00:34:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个QFrame上显示多个QLabels,放在QScrollArea中。在

我可以告诉QScrollArea使QLabels与{}一起可见,但我似乎找不到一个方法来确定子小部件当前是否可见。我希望有类似QScrollArea.isWidgetVisible(QWidget)的东西。在

我尝试使用孩子自己的方法,即QLabel.isVisible(),但是不管QLabelQScrollArea中是否可见,它总是返回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_()

Tags: 方法importselfchildinitdefsysarea
2条回答

QScrollArea::ensureWidgetVisible就可以了。在

您可以使用QSCrollArea::childAt ( int x, int y ).isvisble()检查小部件的可见性。在

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()

相关问题 更多 >