PyQt tablewidget изменяет расположение вертикальной полосы прокрутки

#python #qt #user-interface #pyqt #qtablewidget

#python #qt #пользовательский интерфейс #pyqt #qtablewidget

Вопрос:

У меня есть QTableWidget в окне. В настоящее время полоса прокрутки таблицы проходит весь путь до верхней части заголовков таблицы:

введите описание изображения здесь

Тем не менее, я бы хотел, чтобы полоса прокрутки начиналась ниже заголовков, в основном перемещая ее вниз по оси y. Мне нужно, чтобы она начиналась с позиции полосы прокрутки на изображении ниже:

введите описание изображения здесь

У кого-нибудь есть идеи, как я мог бы это сделать?

Ответ №1:

Самое простое решение — задавать геометрию полосы прокрутки всякий раз, когда изменяется размер таблицы:

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

Если вы не хотите создавать подклассы, добавьте фильтр событий для таблицы:

 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)