#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)