我正在开发一个相当简单的 PyQt 程序,它基本上只是一个充满项目的 QTableWidget
。我的目标是根据父 QTableWidget
的大小自动调整项目的宽度和高度。例如,如果我将窗口大小调整得较小,则项目的宽度和高度应减小,但项目数量应保持相同,并且项目仍应完全填充父 QTableWidget
。如您所见,我目前正在使用 setColumnWidth
和 setRowHeight
手动设置宽度和高度。
我已经尝试了以下 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
方法。然后重写主小部件的 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()
关于python - PyQt4 QTableWidget : Set row width and column height to fill parent widget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35663512/