Создайте QScrollArea, прикрепленную к макету с табличным представлением - PullRequest
0 голосов
/ 08 мая 2020

У меня есть табличное представление, в котором отображаются некоторые данные 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))
...