我目前有python函数(下面)从pandas dataframe(df)构建一个QTableWidget。我希望这个QTableWidget默认为显示所有单元格的大小。不幸的是,QSizePolicy.Maximum使用的默认大小提示会切断表中的某些行和列。 QTableWidget似乎没有setSizeHint()方法。如何将大小提示设置为显示所有行和列的大小?
我曾尝试寻找以前关于此的帖子,但我找到的答案都没有在Python中使用QTableWidget。
import PyQt5.QWidgets as QWidgets
import PyQt5.QtCore as QtCore
import PyQt5.QtGui as QtGui
import pandas as pd
def build_table(self,df):
table = QWidgets.QTableWidget()
table.setColumnCount(len(df.columns))
table.setRowCount(len(df.index))
table.setHorizontalHeaderLabels(df.columns)
for row_num, row in enumerate(df.index):
for col_num, col in enumerate(df.columns):
item = QWidgets.QTableWidgetItem(str(df.loc[row,col]))
item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
table.resizeColumnsToContents()
table.resizeRowsToContents()
table.verticalHeader().setVisible(False)
table.setSizePolicy(QWidgets.QSizePolicy.Maximum,QWidgets.QSizePolicy.Maximum)
sizeAdjustPolicy:SizeAdjustPolicy
此属性包含描述视口大小更改时滚动区域大小如何更改的策略。
试试吧:
import sys
import pandas as pd
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class MyWin(QMainWindow):
def __init__(self, df):
super().__init__()
centralWidget = QWidget()
self.setCentralWidget(centralWidget)
layout = QGridLayout(centralWidget)
self.tableWidget = self.build_table(df)
self.tableWidget.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents) # <---
self.tableWidget.setAlternatingRowColors(True)
self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
layout.addWidget(self.tableWidget)
layout.addWidget(QPushButton("Button"))
def build_table(self, df):
table = QTableWidget()
table.setColumnCount(len(df.columns))
table.setRowCount(len(df.index))
table.setHorizontalHeaderLabels(df.columns)
for row_num, row in enumerate(df.index):
for col_num, col in enumerate(df.columns):
item = QTableWidgetItem(str(df.loc[row,col]))
table.setItem(row_num, col_num, item) # +++
item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
table.resizeColumnsToContents()
table.resizeRowsToContents()
table.verticalHeader().setVisible(False)
# self.table.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) # ---
return table # +++
df = pd.DataFrame(
{'a': ['1','2','3','4','Mary','Jim','John'], 'b': ['3','4','1','2',100, 200, 300], 'c': ['1','2','3','4','a','b','c'],
'd': ['1','2','3','4','Mary','Jim','John'], 'e': ['1','2','3','4',100, 200, 300], 'f': ['1','2','3','4','a','b','c'],
'g': ['1','2','3','4','Mary','Jim','John'], 'h': ['1','2','3','4',100, 200, 300], 'j': ['1','2','3','4','a','b','c'],
'k': ['1','2','3','4','Mary','Jim','John'], 'l': ['1','2','3','4',100, 200, 300], 'm': ['1','2','3','4','a','b','c'],
})
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyWin(df)
w.show()
sys.exit(app.exec_())