PyQt4 QTableWidget:设置行宽列高填充父widget

PyQt4 QTableWidget: Set row width and column height to fill parent widget

我正在开发一个相当简单的 PyQt 程序,它基本上只是一个 QTableWidget 的项目。我的目标是让项目的宽度和高度根据父级 QTableWidget 的大小自动调整大小。例如,如果我将 window 的大小调整得更小,项目的宽度和高度应该减小,但是项目的数量应该保持不变,并且项目应该仍然完全填满父级 QTableWidget。如您所见,我目前正在使用 setColumnWidthsetRowHeight 手动设置宽度和高度。

我已经尝试了以下 Stack Overflow 问题以及许多其他问题和网站中的建议,none 其中的内容是我正在尝试做的。

1. How to make qtablewidgets columns assume the maximum space

2. pyqt how to maximize the column width in a tableview

这是我目前使用的代码:

from PyQt4 import QtGui, QtCore
import PyQt4.Qt

class Window(QtGui.QWidget):
    def __init__(self, rows, columns):
        super(Window, self).__init__()
        self.setWindowState(QtCore.Qt.WindowMaximized)
        self.table = QtGui.QTableWidget(rows, columns, self)
        self.table.verticalHeader().setVisible(False)
        self.table.horizontalHeader().setVisible(False)

        # this is what I am currently using to set the row and column size
        for x in range(columns):
            self.table.setColumnWidth(x, 13)
        for x in range(rows):
            self.table.setRowHeight(x, 13)
        for row in range(rows):
            for column in range(columns):
                item = QtGui.QTableWidgetItem()
                self.table.setItem(row, column, item)

        layout = QtGui.QGridLayout(self)
        layout.addWidget(self.table, 0, 0, 1, 6)

        self.show()


def main():
    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window(54, 96)
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

我对这个问题的长度表示抱歉,但我想把我的问题说清楚。预先感谢大家的帮助!

您可以使用 QItemDelegate and overriding the sizeHint 方法执行此操作。然后覆盖主小部件的 resizeEventshowEvent 方法,以便在调整小部件大小时更新每个单元格的大小。

import sys
from PyQt4 import QtGui, QtCore


class MyDelegate(QtGui.QItemDelegate):

    def __init__(self, parent, table):
        super(MyDelegate, self).__init__(parent)
        self.table = table

    def sizeHint(self, option, index):
        # Get full viewport size
        table_size = self.table.viewport().size()
        gw = 1  # Grid line width
        rows = self.table.rowCount() or 1
        cols = self.table.columnCount() or 1
        width = (table_size.width() - (gw * (cols - 1))) / cols
        height = (table_size.height() -  (gw * (rows - 1))) / rows
        return QtCore.QSize(width, height)


class Window(QtGui.QWidget):
    def __init__(self, rows, columns):
        super(Window, self).__init__()
        self.lay = QtGui.QVBoxLayout()
        self.setLayout(self.lay)
        self.table = QtGui.QTableWidget(rows, columns, self)
        self.table.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.table.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.lay.addWidget(self.table)
        self.delegate = MyDelegate(self, self.table)
        self.table.setItemDelegate(self.delegate)

    def showEvent(self, event):
        super(Window, self).showEvent(event)
        self.resizeTable()

    def resizeTable(self):
        self.table.resizeRowsToContents()
        self.table.resizeColumnsToContents()

    def resizeEvent(self, event):
        super(Window, self).resizeEvent(event)
        self.resizeTable()