信号 QscrollArea

Signal QscrollArea

我想知道每次 window 调整大小时是否可以有一个信号或其他信息来知道滚动条何时可用以及何时不再可用?

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

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

        widget = QWidget()

        layout = QVBoxLayout(self)

        for _ in range(10):
            btn = QPushButton()
            layout.addWidget(btn)

        widget.setLayout(layout)

        scroll = QScrollArea()
        scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        scroll.setWidget(widget)
        vLayout = QVBoxLayout(self)
        vLayout.addWidget(scroll)
        self.setLayout(vLayout)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    dialog = Widget()
    dialog.show()
    app.exec_()

由于 QScrollBar 通常仅在其范围最大值大于 0 时才可见,因此您可以只检查该值。

class Widget(QWidget):
    def __init__(self, parent= None):
        # ....
        # note that the scroll area is now an instance member
        self.scroll = QScrollArea()
        self.scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.scroll.setWidget(widget)
        self.scroll.verticalScrollBar().rangeChanged.connect(self.checkScrollBarRange)
        vLayout = QVBoxLayout(self)
        vLayout.addWidget(self.scroll)
        self.setLayout(vLayout)

        # the next is important when resizing the widget containing the scroll area
        self.scroll.installEventFilter(self)

    def eventFilter(self, source, event):
        if source == self.scroll and event.type() == QEvent.Resize:
            self.checkScrollBarRange()
        return super().eventFilter(source, event)

    def checkScrollBarRange(self):
        if (self.scroll.verticalScrollBarPolicy() != Qt.ScrollBarAlwaysOff and
            self.scroll.verticalScrollBar().maximum()):
                print('vertical scroll bar IS visible')
        else:
            print('vertical scroll bar NOT visible')