Автоматическое изменение размера окна под размер содержимого
У меня есть окно, которое наполняется контентом, и в него может попасть и большая и маленькая таблица.
Я хотел бы, чтобы окно подстроило свои размеры под размеры таблицы. Каким образом это можно реализовать?
Код проекта:
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_())

