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

问题描述 投票:2回答:1

我目前有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)  
python python-3.x pyqt pyqt5
1个回答
0
投票

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

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.