Python 如何确定QScrollArea的子部件是否可见?

Python 如何确定QScrollArea的子部件是否可见?,python,qt4,pyqt4,qscrollarea,Python,Qt4,Pyqt4,Qscrollarea,我正在QFrame上显示多个qlabel,放置在qscrollara中 我能够告诉QScrollArea使用QScrollArea.ensureWidgetVisible(QLabel)使任何QLabel可见,但我似乎找不到一种方法来确定子小部件当前是否可见。我希望类似于QScrollArea.isWidgetVisible(QWidget)的东西 我尝试使用孩子自己的方法,即QLabel.isVisible(),但无论QLabel在qscrollara中是否可见,它总是返回True(参见下面的

我正在
QFrame
上显示多个
qlabel
,放置在
qscrollara


我能够告诉
QScrollArea
使用
QScrollArea.ensureWidgetVisible(QLabel)
使任何
QLabel可见,但我似乎找不到一种方法来确定子小部件当前是否可见。我希望类似于
QScrollArea.isWidgetVisible(QWidget)
的东西

我尝试使用孩子自己的方法,即
QLabel.isVisible()
,但无论
QLabel
qscrollara
中是否可见,它总是返回
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_()
#/usr/bin/env python
导入系统
从PyQt4导入QtGui、QtCore
application=QtGui.QApplication(sys.argv)
班级面积(QtGui.QScrollArea):
定义初始化(自,子):
超级(区域,自我)。\uuuu初始化
self.child=child
self.setWidget(self.child)
自我设置固定大小(100100)
类MainWidget(QtGui.QFrame):
def uuu init uuu(self,parent=None):
QtGui.QFrame.\uuuuu init\uuuuu(self,parent)
self.layout=QtGui.QVBoxLayout()
n=1
而n!=10:
label=QtGui.QLabel(“”+str(n)+“”)
self.layout.addWidget(标签)
n+=1
self.setLayout(self.layout)
def wheelEvent(自我,事件):
打印“控制盘事件:”
对于self中的child.children()[1:]:
打印child.isVisible()
event.ignore()
mainwidget=mainwidget()
面积=面积(mainwidget)
area.show()
application.exec()
就可以了

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

可以


您可以使用
qscrolrea::childAt(int x,int y).isVisible()
来检查小部件的可见性。

isVisible
与您想要做的不同。它告诉小部件是否隐藏。即使它不在视口中,小部件也可见,除非您
隐藏它

您可以使用
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()

isVisible
与您想要执行的操作不同。它告诉小部件是否隐藏。即使它不在视口中,小部件也可见,除非您
隐藏它

您可以使用
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()

QScrollArea.ensureWidgetVisible只会移动小部件使其可见。它不会告诉我小部件一开始是否可见。QScrollArea.childAt仅返回给定位置的小部件,然后QWidget.isVisible应返回小部件是否可见。这与我在上面的代码中所做的没有什么不同,我返回了所有子窗口小部件,但它不起作用,因为它为所有窗口小部件返回True,即使它们在QScrollArea.QScrollArea.ensureWidgetVisible中不可见,它只会移动窗口小部件使其可见。它不会告诉我小部件一开始是否可见。QScrollArea.childAt仅返回给定位置的小部件,然后QWidget.isVisible应返回小部件是否可见。这与我在上面的代码中所做的没有什么不同,我在代码中返回了所有子窗口小部件,但它不起作用,因为它为所有窗口小部件返回True,即使它们在qscrollara中不可见。