如何使QTableWidget适应最小的空间

时间:2017-06-07 08:26:32

标签: python pyqt resize pyqt5 qtablewidget

在Python中使用PyQt5,我试图创建一个包含不同数量单元格的QTableWidgets网格。我使桌子大小可调,以便它们适合窗户的可用尺寸。我可以在增加窗口大小的同时正确调整表格,也就是说,单元格保持相同的大小,QTableWidgets将其大小调整为可用空间。通过覆盖QTableWidget类的resizeEvent并设置QGridLayout的行和列延伸来完成此调整。如下图所示。

screenshot

然而,在使QMainWindow变小的同时,QTableWidgets在某些时候变得无法将其尺寸调整得更小。

screenshot

在使窗口变小时,是否可以使QTableWidgets的尺寸变小?显然,单元格中的值可以实现这一点。

下面给出了我实现上表格的代码。

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)

1 个答案:

答案 0 :(得分:0)

表格不会调整小于默认的最小尺寸。所以只需选择一个更合适的值,如下所示:

class MyTable(QTableWidget):
    def __init__(self, r, c):
        ...
        self.setMinimumSize(40, 40)