Python 如何检测小部件是否在视野中?PyQt

Python 如何检测小部件是否在视野中?PyQt,python,python-3.x,pyqt,Python,Python 3.x,Pyqt,我有一个QScrollArea,里面有很多小部件 我找不到一种方法来检测滚动后看到的小部件 有没有办法在滚动后检测哪些小部件可见?如果您想知道哪些小部件可见,请使用此功能: def isVisibleWidget(widget): if not widget.visibleRegion().isEmpty(): return True return False 如果您只想检测滚动条的移动,则必须使用以下生成的信号: {your QScrollArea}.vert

我有一个
QScrollArea
,里面有很多小部件

我找不到一种方法来检测滚动后看到的小部件

有没有办法在滚动后检测哪些小部件可见?

如果您想知道哪些小部件可见,请使用此功能:

def isVisibleWidget(widget):
    if not widget.visibleRegion().isEmpty():
        return True
    return False
如果您只想检测滚动条的移动,则必须使用以下生成的信号:

{your QScrollArea}.verticalScrollBar()
{your QScrollArea}.horizontalScrollBar()
在本例中,使用
valueChanged
信号

示例:

import sys

from PyQt5.QtWidgets import QApplication, QPushButton, QScrollArea, QVBoxLayout, QWidget


class Widget(QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent=parent)

        widget = QWidget()
        layout = QVBoxLayout(self)
        self.buttons = []
        for i in range(20):
            btn = QPushButton(str(i))
            self.buttons.append(btn)
            layout.addWidget(btn)
        widget.setLayout(layout)
        scroll = QScrollArea()
        scroll.setWidget(widget)

        vLayout = QVBoxLayout(self)
        vLayout.addWidget(scroll)
        self.setLayout(vLayout)

        scroll.verticalScrollBar().valueChanged.connect(self.slot)
        scroll.horizontalScrollBar().valueChanged.connect(self.slot)
        self.show()
        self.slot()

    def slot(self):
        visibles = []
        for btn in self.buttons:
            if self.isVisibleWidget(btn):
                visibles.append(btn.text())
        print(visibles)

    def isVisibleWidget(self, widget):
        if not widget.visibleRegion().isEmpty():
            return True
        return False


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Widget()
    sys.exit(app.exec_())

输出:

['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13']
['6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19']

输出:

['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13']
['6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19']

不熟悉Python,但我会检查滚动条的当前X和Y位置,并使用该值计算覆盖的区域。之后,您可以使用此区域检查组件是否在其中。可能要做很多事情,但我可能会这样做