Централизуйте QTableView в окне с помощью вертикальных прокладок

Я пытаюсь создать главное окно (фиксированный размер), которое содержит QTableView, с QSpacerItems выше и ниже, чтобы централизовать таблицу (по вертикали).

(Извините, не могу опубликовать изображение, по-видимому).

У меня есть QVBoxLayout, в котором у меня есть вертикальная прокладка, QTableView и еще одна вертикальная прокладка. Я играл со всеми комбинациями QSizePolicy для всех трех виджетов, но не могу отобразить таблицу без полос прокрутки. (Я не могу использовать Qt.ScrollBarAlwaysOff, потому что они понадобятся, если количество элементов превышает размер основного окна). Таким образом, вертикальные полосы прокрутки в QTableView отображаются, даже если вертикальные разделители поглощают много места между представлением и главным окном.

Я хочу, чтобы вертикальные разделители занимали минимальное пространство, требуемое выше и ниже виджета таблицы, чтобы централизовать строки, а виджет таблицы отображал как можно больше строк без полос прокрутки.

1 ответ

Вы можете создать подкласс QTableView, использовать QSizePolicy::Fixed в вертикальном направлении и переопределить sizeHint(), чтобы вернуть предпочитаемую высоту по вертикали.

Вот рабочий пример (Вы не указали язык, поэтому я предполагаю, что это Python:-):

import sys
from PySide import QtCore, QtGui

class MyTableView(QtGui.QTableView):
    def __init__(self, parent=None):
        super().__init__(parent)
        #assume expanding in horizontal direction and fixed in vertica direction
        self.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)

    def sizeHint(self):
        return QtCore.QSize(400, 500) #I allow you to edit that!

class MyApplication(QtGui.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        layout = QtGui.QVBoxLayout()
        table_view = MyTableView()
        layout.addWidget(table_view)
        self.model = QtGui.QStringListModel() #use a string list model for simplicity
        table_view.setModel(self.model)
        self.strings = ['1', '2', '3']
        self.model.setStringList(self.strings) #initialize the model
        self.counter = 4
        button = QtGui.QPushButton('Add Cell') #this button updates the model and adds cells
        button.clicked.connect(self.addCell)
        layout.addWidget(button)
        self.setLayout(layout)

    def addCell(self):
        self.strings.append(str(self.counter))
        self.counter += 1
        self.model.setStringList(self.strings)

app = QtGui.QApplication(sys.argv)
main = MyApplication()
main.show()
sys.exit(app.exec_())
Другие вопросы по тегам