QTableView-通过布局获得正确的大小

QTableView-通过布局获得正确的大小,qt,pyqt,pyside,Qt,Pyqt,Pyside,我有一个QTableView,它显示sqlite数据库中的一些数据(目前有两行两列)。QTableView位于QFrame内,QFrame又是QMainWindow的中心小部件。QFrame使用QVBoxLayout。问题是当我将QTableView添加到QVBoxLayout时,给QTableView的空间太大了。如图所示,最后一列的右边有一个空格,最后一行的下面有一个空格 我在tableView和QFrame上尝试了不同的SizePolicy、resizes()、sizeHints(),但似

我有一个QTableView,它显示sqlite数据库中的一些数据(目前有两行两列)。QTableView位于QFrame内,QFrame又是QMainWindow的中心小部件。QFrame使用QVBoxLayout。问题是当我将QTableView添加到QVBoxLayout时,给QTableView的空间太大了。如图所示,最后一列的右边有一个空格,最后一行的下面有一个空格

我在tableView和QFrame上尝试了不同的SizePolicy、resizes()、sizeHints(),但似乎没有任何效果。我没有更改默认大小策略或任何东西。现在,我可以使用建议的解决方案(计算表格的高度和宽度,并设置表格视图的最大大小),这甚至是我的应用程序可以接受的解决方案。但是问题是,在所有默认的SizePolicy中,tableView不应该被赋予适当的空间吗?我是说,我做错了什么导致这种行为发生吗

图片:

守则:

import sys
from PySide import QtGui, QtSql, QtCore

class MainWindow(QtGui.QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()

        self.initUI()

    def initUI(self):

        #-------
        #CREATE WIDGETS
        #-------
        frame = QtGui.QFrame()

        someLabel = QtGui.QLabel("SomeLabel")
        someOtherLabel = QtGui.QLabel("SomeOtherLabel")
        self.tableView = QtGui.QTableView()

        db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
        db.setDatabaseName('database.db')
        db.open()

        tableViewModel = QtSql.QSqlQueryModel()
        tableViewModel.setQuery('SELECT currencySymbol, balanceAmount FROM cashBalances', db)
        tableViewModel.setHeaderData(0, QtCore.Qt.Horizontal, "Currency") #set column names
        tableViewModel.setHeaderData(1, QtCore.Qt.Horizontal, "Balance")
        self.tableView.setModel(tableViewModel)
        #--------
        #CREATE LAYOUT
        #--------

        self.setCentralWidget(frame)
        frameLayout = QtGui.QVBoxLayout()
        frameLayout.addWidget(someLabel)
        frameLayout.addWidget(self.tableView)
        frameLayout.addWidget(someOtherLabel)
        frame.setLayout(frameLayout)

        self.show()

def main():

    app = QtGui.QApplication(sys.argv)
    mainWindow = MainWindow()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

对于专栏,您的问题可以很容易地解决。对于行,这取决于您想要什么

如果列不多,可以指定哪些列应拉伸。为此,通常使用标题视图,例如

horizontalHeader()->setStretchLastSection(true);

也许您可以对行执行类似的操作,但您到底想要什么?将行拉伸到最大高度可能没有那么好。标签也不应该拉伸。如果您只需要表格或标签未使用的某个区域,并且该区域应位于表格下方,则可以尝试插入间隔项


我知道这类事情有点烦人。。。第一步应该始终使用标题视图。

所有可滚动视图都以这种方式工作。当添加/删除项目时,列表小部件不会调整大小-您希望它调整大小吗?@ekhumoro当我从布局中删除QTableView时,主窗口会变得非常小,非常适合两个标签(没有额外的空间,它非常适合)。这就是为什么我认为QTableView会考虑显示多少行/列,并分配足够的空间来完美地容纳所有内容。在我的示例中,可以显示6行(我认为),而不必使QTableView变得可滚动。但感谢您的评论,据我所知,当我将QTableView添加到布局时,它有一些默认大小,我必须自己调整大小。正交:使用
sizedJustPolicy(QAbstractScrollArea::AdjustToContent)
horizontalHeader()->setResizeMode(0 /* first column */, QHeaderView::Stretch);