【问题标题】:PyQt4 QTableWidget: Set row width and column height to fill parent widgetPyQt4 QTableWidget:设置行宽和列高以填充父小部件
【发布时间】:2016-06-10 08:45:19
【问题描述】:

我正在开发一个相当简单的 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()

我同意这个问题的长度,但我想让我的问题非常清楚。提前感谢大家的帮助!

【问题讨论】:

    标签: python pyqt pyqt4 qtablewidget


    【解决方案1】:

    您可以使用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()
    

    【讨论】:

    • 我厌倦了你的代码,它完全填满了表格。但是,它不会停留在窗口的范围内。有没有办法让它在不超出窗口的情况下填满窗口?
    • “越过窗户”是什么意思?可以发个截图吗?
    • Here 是截图。我的列和行比屏幕上显示的要多。
    • 我认为您还必须考虑网格线。它们可能只有 1-2 个像素。我更新了答案
    • 让我澄清一下,我有 50 行和 50 列。即使在我重试了您的代码之后,也只显示了 30 行和 46 列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多