Централизовать QTableView в окне с вертикальными разделителями

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

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

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

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


person innerhippy    schedule 19.03.2013    source источник


Ответы (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_())
person MadeOfAir    schedule 18.06.2013