如何让QTableWidget调整到最小space
How to make QTableWidget adjust to minimal space
将 PyQt5 与 Python 结合使用,我正在尝试创建具有不同单元格数量的 QTableWidgets 网格。我将 tables 调整为 table 大小,以便它们很好地适应 window 的可用大小。我能够在增加 window 大小的同时正确调整 tables,也就是说,单元格保持相同的大小,而 QTableWidgets 将它们的大小调整为自由 space。这种调整是通过覆盖 QTableWidget class 的 resizeEvent 并为 QGridLayout 设置行和列拉伸来完成的。如下图所示。
然而,在缩小 QMainWindow 的同时,QTableWidgets 在某些时候变得无法将它们的尺寸调整得更小。
是否可以在缩小 window 的同时使 QTableWidgets 的尺寸变小?显然,单元格中的值可以实现这一点。
下面给出了我用来实现上述 table 网格的代码。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QGridLayout
from PyQt5.QtWidgets import QTableWidget, QWidget
class MyTable(QTableWidget):
def __init__(self, r, c):
super().__init__(r, c)
self.horizontalHeader().hide()
self.verticalHeader().hide()
def resizeEvent(self, event):
eh = event.size().height()
ew = event.size().width()
ehremain = eh
eqremain = ew
rh = int(eh // self.rowCount())
cw = int(ew // self.columnCount())
for i in range(self.rowCount()-1):
self.setRowHeight(i, rh)
ehremain -= rh
self.setRowHeight(self.rowCount()-1, ehremain)
for j in range(self.columnCount()-1):
self.setColumnWidth(j, cw)
eqremain -= cw
self.setColumnWidth(self.columnCount()-1, eqremain)
class TableGrid(QWidget):
def __init__(self):
super().__init__()
self.table1 = MyTable(1,1)
self.table2 = MyTable(1,3)
self.table3 = MyTable(3,1)
self.table4 = MyTable(3,3)
grid_layout = QGridLayout()
grid_layout.addWidget(self.table1, 0,0)
grid_layout.addWidget(self.table2, 0,1)
grid_layout.addWidget(self.table3, 1,0)
grid_layout.addWidget(self.table4, 1,1)
grid_layout.setRowStretch(0,1)
grid_layout.setRowStretch(1,3)
grid_layout.setColumnStretch(0,1)
grid_layout.setColumnStretch(1,3)
self.setLayout(grid_layout)
self.show()
class Window(QMainWindow):
def __init__(self):
super().__init__()
self.table_grid = TableGrid()
self.setCentralWidget(self.table_grid)
self.show()
if __name__ =="__main__":
app = QApplication.instance() # checks if QApplication already exists
if not app: # create QApplication if it doesnt exist
app = QApplication(sys.argv)
app.aboutToQuit.connect(app.deleteLater)
sheet = Window()
app.exec_()
#sys.exit(0)
表格不会调整为小于默认的最小大小。所以只要选择一个更合适的值,像这样:
class MyTable(QTableWidget):
def __init__(self, r, c):
...
self.setMinimumSize(40, 40)
将 PyQt5 与 Python 结合使用,我正在尝试创建具有不同单元格数量的 QTableWidgets 网格。我将 tables 调整为 table 大小,以便它们很好地适应 window 的可用大小。我能够在增加 window 大小的同时正确调整 tables,也就是说,单元格保持相同的大小,而 QTableWidgets 将它们的大小调整为自由 space。这种调整是通过覆盖 QTableWidget class 的 resizeEvent 并为 QGridLayout 设置行和列拉伸来完成的。如下图所示。
然而,在缩小 QMainWindow 的同时,QTableWidgets 在某些时候变得无法将它们的尺寸调整得更小。
是否可以在缩小 window 的同时使 QTableWidgets 的尺寸变小?显然,单元格中的值可以实现这一点。
下面给出了我用来实现上述 table 网格的代码。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QGridLayout
from PyQt5.QtWidgets import QTableWidget, QWidget
class MyTable(QTableWidget):
def __init__(self, r, c):
super().__init__(r, c)
self.horizontalHeader().hide()
self.verticalHeader().hide()
def resizeEvent(self, event):
eh = event.size().height()
ew = event.size().width()
ehremain = eh
eqremain = ew
rh = int(eh // self.rowCount())
cw = int(ew // self.columnCount())
for i in range(self.rowCount()-1):
self.setRowHeight(i, rh)
ehremain -= rh
self.setRowHeight(self.rowCount()-1, ehremain)
for j in range(self.columnCount()-1):
self.setColumnWidth(j, cw)
eqremain -= cw
self.setColumnWidth(self.columnCount()-1, eqremain)
class TableGrid(QWidget):
def __init__(self):
super().__init__()
self.table1 = MyTable(1,1)
self.table2 = MyTable(1,3)
self.table3 = MyTable(3,1)
self.table4 = MyTable(3,3)
grid_layout = QGridLayout()
grid_layout.addWidget(self.table1, 0,0)
grid_layout.addWidget(self.table2, 0,1)
grid_layout.addWidget(self.table3, 1,0)
grid_layout.addWidget(self.table4, 1,1)
grid_layout.setRowStretch(0,1)
grid_layout.setRowStretch(1,3)
grid_layout.setColumnStretch(0,1)
grid_layout.setColumnStretch(1,3)
self.setLayout(grid_layout)
self.show()
class Window(QMainWindow):
def __init__(self):
super().__init__()
self.table_grid = TableGrid()
self.setCentralWidget(self.table_grid)
self.show()
if __name__ =="__main__":
app = QApplication.instance() # checks if QApplication already exists
if not app: # create QApplication if it doesnt exist
app = QApplication(sys.argv)
app.aboutToQuit.connect(app.deleteLater)
sheet = Window()
app.exec_()
#sys.exit(0)
表格不会调整为小于默认的最小大小。所以只要选择一个更合适的值,像这样:
class MyTable(QTableWidget):
def __init__(self, r, c):
...
self.setMinimumSize(40, 40)