Автоматическое изменение размера окна под размер содержимого

У меня есть окно, которое наполняется контентом, и в него может попасть и большая и маленькая таблица.

Я хотел бы, чтобы окно подстроило свои размеры под размеры таблицы. Каким образом это можно реализовать?

введите сюда описание изображения

Код проекта:

import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtWidgets import QApplication, QMainWindow, QDesktopWidget, QTableWidget, QTableWidgetItem, QLineEdit, \
    QGridLayout, QLabel, QInputDialog, QMessageBox
import pandas as p

uzg = []
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 240)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_5.setGeometry(QtCore.QRect(0, 0, 100, 23))
        self.pushButton_5.setObjectName("pushButton5")
        self.pushButton_5.clicked.connect(self.rand)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def rand(self):
        print("hello")
        uzg.clear()
        for i in range(5):
            uzg.append([])
            for j in range(5):
                uzg[i].append(j)
        self.openMatrix()
        
    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "123"))
        self.pushButton_5.setText(_translate("MainWindow", "Rand"))
        
    def openMatrix(self):
        self.wi = WindowMatrix(self)
        self.wi.show()
        

class WindowMatrix(QtWidgets.QMainWindow):
    def __init__(self, info_str, parent=None):
        super(WindowMatrix, self).__init__(parent)
        self.setWindowTitle("Matrix")
        self.setGeometry(0,0,330,270)
        self.center()
        self.html2 = self.df()
        self.plot_widget1 = QWebEngineView()
        self.plot_widget1.setHtml(self.html2)
        self.setCentralWidget(self.plot_widget1)
    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())
    def df(self):
        df = p.DataFrame(data=uzg)
        self.html2 = '<html><body>'
        self.html2 = df.to_html()
        self.html2 += '</body></html>'
        return self.html2

def application():
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
    
application()

Ответы (1 шт):

Автор решения: S. Nick

Я не совсем понял ваш код, но я покажу вам один из возможных вариантов как таблицы с разным наполнением заполняют отведенное для них место в окне.

import sys
import random
import pandas as pd
from PyQt5.Qt import *


class PandasModel(QAbstractTableModel):
    def __init__(self, data):
        QAbstractTableModel.__init__(self)
        self._data = data

    def rowCount(self, parent=None):
        return self._data.shape[0]

    def columnCount(self, parnet=None):
        return self._data.shape[1]                         

    def data(self, index, role=Qt.DisplayRole):
        if index.isValid():
            if role == Qt.DisplayRole:
                return str(self._data.iloc[index.row(), index.column()])
        return None

    def headerData(self, col, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self._data.columns[col]
        return None


class TableView(QTableView):
    def __init__(self, df):
        super().__init__()

        self.model = PandasModel(df)
        self.setModel(self.model)
        self.setAlternatingRowColors(True)
        

class MainWindow(QMainWindow):
    def __init__(self, df):
        super().__init__()
        
        centralWidget= QWidget()
        self.setCentralWidget(centralWidget)

        self.tableView = TableView(df)
        self.tableView.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents)  
        self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        layout = QGridLayout(centralWidget)
        layout.addWidget(self.tableView)
        layout.addWidget(QPushButton("Click me", clicked=self.onClicked))
        
    def onClicked(self):
        uzg_dict = {}   
        columns = random.randrange(0, 20)
        rows = random.randrange(0, 20)
        for column in range(columns):
            row = [ f'{r}-{column}' for r in range(rows)]
            uzg_dict[str(column)] = row
       
        df = pd.DataFrame(uzg_dict)
        self.tableView.model = PandasModel(df)
        self.tableView.setModel(self.tableView.model)


df = pd.DataFrame({
    'a': ['0-0', '1-0', '2-0', '3-0', '4-0', '5-0', '6-0'], 
    'b': ['0-1', '1-1', '2-1', '3-1', '4-1', '5-1', '6-1'], 
    'c': ['0-2', '1-2', '2-2', '3-2', '4-2', '5-2', '6-2'],
    'd': ['0-3', '1-3', '2-3', '3-3', '4-3', '5-3', '6-3'], 
    'e': ['0-4', '1-4', '2-4', '3-4',  100,   200,   300], 
    'f': ['0-5', '1-5', '2-5', '3-5', '4-f', '5-f', '6-f'],
    'g': ['0-6', '1-6', '2-6', '3-6', '4-g', 'Hello', '' ], 
    'h': ['0-7', '1-7', '2-7', '3-7', '4-h', 'World', 300], 
    'j': ['0-8', '1-8', '2-8', '3-8', '4-8', '5-8', '6-8'],
    'k': ['0-9', '1-9', '2-9', '3-9', '4-9', '5-9', '6-9'], 
    'l': ['0-10','1-10','2-10','3-10','4-10','5-10','6-10'], 
    'm': ['0-11','1-11','2-11','3-11','4-11', '',  0 ],
})


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow(df)
    w.resize(800, 250)
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка