我在QWidget的QVBoxLayout中有一个QTableView,它本身在QWidget的QHBoxLayout和QVBoxLayout中,该QWidget被设置为QMainWindow的中央小部件。
QTableView具有固定数量的列和任意数量的行。
当主窗口第一次打开时,我希望QTableView最初显示所有列。但是,在打开主窗口时,QTableView仅显示数据的前几列,其余的则需要水平滚动条。我希望所有列在开始时都是可见的,因此除非用户调整拆分的大小,否则不需要水平滚动条。
下面的代码是我所能获得的最接近的代码。除了我不需要固定桌子。现在,它的当前打开方式包括一个水平滚动条,可以移动一个位置。
我认为如果没有fixedwidth调用,该窗口会将所有三个小部件都设置为相等的宽度
编辑:看来,如果我向view_width添加一个4的缓冲区,我得到的正是我需要的宽度,而没有出现水平滚动条。
如果我执行self.view.setFixedWidth(view_width),其中view_width = hwidth + swidth + 4,它将显示表视图的所有列。
但是,如果我在self.view.resize(view_width,self.view.height())中使用相同的view_width,我可以从self.view.width()中看到该视图现在具有正确的宽度,但是QMainwindow仍然打开,表格只显示前几列,并带有水平滚动条。
代码结构:
QtWidgets.QMainWindow.__init__(self, parent, windowTitle="Selection Window")
label_one = QtWidgets.QLabel('Section One')
self.list_one = QtWidgets.QListWidget()
self.button_one = QtWidgets.QPushButton("Button One")
layout_one = QtWidgets.QVBoxLayout()
layout_one.addWidget(label_one)
layout_one.addWidget(self.list_one)
layout_one.addWidget(self.button_one)
section_one = QtWidgets.QWidget()
section_one.setLayout(layout_one)
label_two = QtWidgets.QLabel('Section Two')
self.list_two = QtWidgets.QListWidget()
self.button_two = QtWidgets.QPushButton("Button Two")
layout_two = QtWidgets.QVBoxLayout()
layout_two.addWidget(label_two)
layout_two.addWidget(self.list_two)
layout_two.addWidget(self.button_two)
section_two = QtWidgets.QWidget()
section_two.setLayout(layout_two)
label_three = QtWidgets.QLabel('Section Three')
layout_three = QtWidgets.QVBoxLayout()
layout_three.addWidget(label_three)
self.view = QtWidgets.QTableView(self)
self.model = QtCore.QAbstractTableModel(numpy_array) # x rows by 4 cols array
self.view.setModel(self.model)
self.view.resizeColumnsToContents()
hwidth = self.view.horizontalHeader().length()
swidth = self.view.verticalScrollBar().height()
view_width = hwidth + swidth
self.view.setFixedWidth(view_width)
layout_three.addWidget(self.view)
section_three = QtWidgets.QWidget()
section_three.setLayout(layout_three)
split = QtWidgets.QSplitter(QtCore.Qt.Horizontal)
split.addWidget(section_one)
split.addWidget(section_two)
split.addWidget(section_three)
run_layout = QtWidgets.QVBoxLayout()
run_layout.addWidget(split)
self.run_button = QtWidgets.QPushButton("Run")
run_layout.addWidget(self.run_button)
run_widget = QtWidgets.QWidget()
run_widget.setLayout(run_layout)
self.setCentralWidget(run_widget)
self.show()