如何在Python中为QTableWidget设置大小提示

3
我目前有一个Python函数(如下),用于从Pandas DataFrame(df)构建QTableWidget。我想让这个QTableWidget默认显示所有单元格的大小。不幸的是,QSizePolicy.Maximum使用的默认Size Hint会截断表格中的某些行和列。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)  
1个回答

2

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_())    

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接