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

Posted

技术标签:

【中文标题】如何在 Python 中为 QTableWidget 设置大小提示【英文标题】:How to I set the Size Hint for A QTableWidget in Python 【发布时间】:2019-02-10 00:09:42 【问题描述】:

我目前有 python 函数(如下)从 pandas 数据框 (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)  

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于如何在 Python 中为 QTableWidget 设置大小提示的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中为接口分配IP地址?

如何在 python 中为 xgboost 编写自定义评估指标?

如何在Python中为现有类添加方法?

如何在python中为dict使用点符号?

如何在 python 中为 plotly boxplot 添加标签?

如何在 python 中为 64 位机器创建安装程序?