【发布时间】: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 添加到布局时,它有一些默认大小,我必须自己调整大小。