QTableView - 使用布局获得正确的大小[重复]

Posted

技术标签:

【中文标题】QTableView - 使用布局获得正确的大小[重复]【英文标题】:QTableView - getting the correct size with layouts [duplicate] 【发布时间】:2016-02-17 18:16:26 【问题描述】:

我有一个 QTableView,它显示来自 sqlite 数据库的一些数据(当前为 2 行和 2 列)。 QTableView 位于 QFrame 内部,而 QFrame 又是 QMainWindow 的中心部件。 QFrame 使用 QVBoxLayout。问题是当我将 QTableView 添加到 QVBoxLayout 时,给 QTableView 的空间太多。从图片中可以看出,最后一列右边有一个空格,最后一行下面有一个空格。

我在 tableView 和 QFrame 上尝试了不同的 SizePolicies、resize()、sizeHints(),但似乎没有任何效果。我没有更改默认 SizePolicy 或任何东西。现在,我可以使用in this question 建议的解决方案(计算表格的高度和宽度并设置表格视图的最大尺寸),它甚至是我的应用程序可以接受的解决方案。但问题是不应该为 tableView 提供所有默认 sizePolicies 的适量空间吗?我的意思是,我是否做错了什么导致这种行为发生?

图片:

代码:

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()

【问题讨论】:

所有可滚动视图都以这种方式运行。添加/删除项目时,列表小部件不会调整大小 - 您希望它这样做吗? @ekhumoro 当我从布局中删除 QTableView 时,MainWindow 变得一样小,可以很好地适合两个标签(任何地方都没有多余的空间,它很适合)。这就是为什么我认为 QTableView 会考虑我正在显示的行/列的数量,并分配足够的空间来完美地适应所有内容。在我的示例中,可以显示 6 行(我认为)而不会使 QTableView 变得可滚动。但感谢您的评论,据我所知,当我将 QTableView 添加到布局时,它有一些默认大小,我必须自己调整大小。 【参考方案1】:

对于列,您的问题可以轻松解决。对于行,这取决于您想要什么。

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

horizontalHeader()->setStretchLastSection(true);

horizontalHeader()->setResizeMode(0 /* first column */, QHeaderView::Stretch);

也许您可以对行执行类似的操作,但您到底想要什么?将行拉伸到全高可能不是那么好。标签也不应该拉伸。如果您只想要一些既不被表格或标签使用的区域,并且该区域应位于表格下方,您可以尝试插入间隔项。

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

【讨论】:

正交:使用sizeAdjustPolicy(QAbstractScrollArea::AdjustToContents)

以上是关于QTableView - 使用布局获得正确的大小[重复]的主要内容,如果未能解决你的问题,请参考以下文章

QTableView 列的相对大小提示

QT:怎么设置QTableView默认序号的大小

何时获得正确的帧大小

如何更改 QTableView 图像大小

如何根据内容调整 QTableView 的高度?

是否可以获得 QQuickItem 布局更改事件?