У меня есть табличное представление, в котором отображаются некоторые данные SQLite с фильтром поиска, связанным с каждым запросом. В табличном представлении отображается запрос комбинации различных фильтров. Фильтры - это некий QLineEdit, расположенный в верхней части таблицы в QHBoxLayout. Размер QLineEdits автоматически изменяется в зависимости от размера столбцов.
Проблема здесь возникает из-за того, что табличное представление слишком велико для показа сразу (в нем 28 столбцов), поэтому у него есть полоса прокрутки, и тогда я не могу автоматически изменяет размер QLineEdits до размера столбцов, так как они ограничены размером окна. Что я хочу сделать, так это создать QScrollArea, который включает как фильтры, так и таблицу таким образом, что та же полоса прокрутки, которая перемещает QTableView, перемещает также макет фильтра с ним, размер которого больше не ограничивается размером окна .
Надеюсь, я ясно объяснил. Заранее большое спасибо!
Вот мой код на данный момент, я пытался какое-то время, но не нашел удовлетворительного решения, либо размер фильтров не увеличивается, либо полоса прокрутки работает только для таблицы, но не для фильтров:
class ManualSearch(QtWidgets.QWidget):
"""Table in which the user can search filtering by any of its columns.
It also allows to open the source document directly."""
def __init__(self, query, header_names):
super(ManualSearch, self).__init__()
# Set up the model view architecture
self.model = QtSql.QSqlTableModel()
self.model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
self.view = QtWidgets.QTableView()
self.view.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
self.view.setModel(self.model)
self.view.setAlternatingRowColors(True)
self.view.setSelectionBehavior(QtWidgets.QTableView.SelectRows)
self.view.resizeColumnsToContents()
self.view.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
header = self.view.horizontalHeader()
header.setStretchLastSection(True)
header.setCascadingSectionResizes(True)
main_layout = QtWidgets.QVBoxLayout(self)
main_layout.sizeConstraint()
# Create a combined layout with the filters and the table
table_layout = QtWidgets.QVBoxLayout()
filter_layout = QtWidgets.QHBoxLayout()
self.filter_list = []
# We use a for loop to create the filters and link them
# to their correspondent columns
for i in range(len(header_names)):
filter_i = QtWidgets.QLineEdit()
filter_i.textChanged.connect(
lambda: self.update_query_filter(query)
)
header.sectionResized.connect(
lambda: self.resize(i, filter_i)
)
header.geometriesChanged.connect(
lambda: self.resize(i, filter_i)
)
filter_layout.addWidget(filter_i)
self.filter_list.append(filter_i)
filter_layout.setContentsMargins(25, 0, 10, 0)
table_layout.addLayout(filter_layout)
table_layout.addWidget(self.view)
self.source_button = QtWidgets.QPushButton('Open source document')
self.source_button.clicked.connect(self.open_source)
self.scroll = QtWidgets.QScrollArea()
self.scroll.setBackgroundRole(QtGui.QPalette.Light)
self.scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
self.scroll.setWidgetResizable(False)
self.scroll.setLayout(table_layout)
main_layout.addLayout(table_layout)
main_layout.addWidget(self.scroll)
main_layout.addWidget(self.source_button)
self.update_query_filter(query)
set_table_headers(self.model, header_names)
def resize(self, order, line):
"""Resize the width of the filter line edit to match the width of its
corresponding column"""
line.setFixedWidth(self.view.columnWidth(order))