PyQt4 QTableWidget:设置行宽列高填充父widget
PyQt4 QTableWidget: Set row width and column height to fill parent widget
我正在开发一个相当简单的 PyQt 程序,它基本上只是一个 QTableWidget
的项目。我的目标是让项目的宽度和高度根据父级 QTableWidget
的大小自动调整大小。例如,如果我将 window 的大小调整得更小,项目的宽度和高度应该减小,但是项目的数量应该保持不变,并且项目应该仍然完全填满父级 QTableWidget
。如您所见,我目前正在使用 setColumnWidth
和 setRowHeight
手动设置宽度和高度。
我已经尝试了以下 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
方法执行此操作。然后覆盖主小部件的 resizeEvent
和 showEvent
方法,以便在调整小部件大小时更新每个单元格的大小。
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()
我正在开发一个相当简单的 PyQt 程序,它基本上只是一个 QTableWidget
的项目。我的目标是让项目的宽度和高度根据父级 QTableWidget
的大小自动调整大小。例如,如果我将 window 的大小调整得更小,项目的宽度和高度应该减小,但是项目的数量应该保持不变,并且项目应该仍然完全填满父级 QTableWidget
。如您所见,我目前正在使用 setColumnWidth
和 setRowHeight
手动设置宽度和高度。
我已经尝试了以下 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
方法执行此操作。然后覆盖主小部件的 resizeEvent
和 showEvent
方法,以便在调整小部件大小时更新每个单元格的大小。
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()