PyQt qtablewidget改变垂直滚动条的位置

PyQt tablewidget change location of vertical scroll bar

我在 window 中有一个 QTableWidget。目前,table 的滚动条一直到 table 的 headers 的顶部:

但是,我希望滚动条从 headers 下面开始,基本上是在 y 轴上向下移动它。 我需要它从下图中滚动条的位置开始:

有人知道我该怎么做吗?

最简单的解决方案是在 table 调整大小时设置滚动条的几何形状:

class Table(QtWidgets.QTableWidget):
    # ...
    def resizeEvent(self, event):
        super().resizeEvent(event)
        self.verticalScrollBar().setGeometry(
            bar.geometry().adjusted(
                0, self.horizontalHeader().height(), 0, 0))

另一种类似的可能性是使用 滚动条小部件 添加到滚动条的顶部,但概念几乎保持不变:

class Table(QtWidgets.QTableWidget):
    def __init__(self):
        super().__init__(20, 20)
        self.scrollBarSpacer = QtWidgets.QWidget()
        self.addScrollBarWidget(self.scrollBarSpacer, QtCore.Qt.AlignTop)

    def resizeEvent(self, event):
        super().resizeEvent(event)
        self.scrollBarSpacer.setFixedHeight(self.horizontalHeader().height())

请注意,在这两种情况下,都必须先调用 resizeEvent() 的基础实现。

如果您不想子类化,请为 table 添加一个事件过滤器:

class SomeWindow(QtWidgets.QMainWindow):
    def __init__(self):
        # ...
        self.table.installEventFilter(self)

    def eventFilter(self, source, event):
        if source == self.table and event.type() == QtCore.QEvent.Resize:
            # let the table handle the event
            source.event(event)
            source.verticalScrollBar().setGeometry(
                source.verticalScrollBar().geometry().adjusted(
                    0, self.horizontalHeader().height(), 0, 0))
            return True
        return super().eventFilter(source, event)