使用垂直隔离器在窗口中集中QTableView

时间:2013-03-19 14:08:27

标签: scrollbar qtableview qscrollarea qsizepolicy

我正在尝试创建一个包含QTableView的主窗口(固定大小),上面和下面都有QSpacerItems,以便集中(垂直)表格。

(抱歉,显然无法发布图片)。

我有一个QVBoxLayout,我有一个垂直间隔,QTableView和另一个垂直间隔。我已经为所有三个小部件使用了QSizePolicy的所有组合,但我无法在没有滚动条的情况下显示该表。 (我不能使用Qt.ScrollBarAlwaysOff,因为如果项目数超过主窗口的大小,将需要它们)。因此,即使垂直隔离物在视图和主窗口之间吸收了足够的空间,也会显示QTableView上的垂直滚动条。

我希望垂直隔离器占用表小部件上方和下方所需的最小空间,以便集中行,并且表小部件可以显示尽可能多的行,而不需要滚动条。

1 个答案:

答案 0 :(得分:0)

您可以继承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_())