QTableView - 使用布局获得正确的大小

时间:2016-02-17 18:16:27

标签: qt pyqt pyside

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

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

图片:

QTableView given too much space

代码:

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

1 个答案:

答案 0 :(得分:0)

您可以轻松解决问题。对于行,它取决于你想要的东西。

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

horizontalHeader()->setStretchLastSection(true);

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

可能你可以为行做类似的事情,但你想要什么呢?将行拉伸到完整高度可能不是那么好。并且标签也不应该伸展。如果您只想要一些既不被表格或标签使用的区域,并且该区域应位于表格下方,您可能会尝试插入间隔项目。

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