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

标签 python pyqt pyqt4 qtablewidget

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

我已经尝试了以下 Stack Overflow 问题以及许多其他问题和网站中的建议,但没有一个能实现我想要做的事情。

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 来执行此操作并覆盖 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()

关于python - PyQt4 QTableWidget : Set row width and column height to fill parent widget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35663512/

相关文章:

python - 如何获取以前版本的 Python Selenium Webdriver

python - 如何将抓取的项目放入 Pyqt5 小部件中?

python - PyQt:在创建小部件时给 parent ?

python - 在pyqtgraph中实现实时绘图最简单的方法是什么

python - 按下 "Enter"后 PyQt QItemDelegate setFocus 到 QTableWidget

python - 在单词列表中查找双字母组

python - 更改 NetworkX 中的节点形状

python - 寻找最长的单词错误?

python - 如何在 QWidget 中跟踪 matplot Canvas 上的鼠标?

python - 如何使用 SIP 制作两个或多个 C++/Qt 类的 python 模块?