Я создаю графический интерфейс, который частично генерируется QtCreator и частично кодом Python. Графический интерфейс представляет собой область прокрутки макета сетки внутри макета сетки. Область прокрутки содержит переменное количество кнопок. Моя цель - изменить размер окна, чтобы оно точно соответствовало сетке кнопок, если не слишком много кнопок, которые делают окно слишком большим, в этом случае я хотел бы ограничить размер окна и сделать область прокрутки прокручиваемой. Я добился этого, но есть проблема, когда окно слишком большое, оно сжимается до нужных размеров только после того, как я вручную перемещаю или изменяю размер окна. (Обратите внимание, что функции «show» и «resizeEvent» переопределены)
Изображение графического интерфейса:
QtCreator:
Код питона:
import sys
from PyQt4 import QtGui, uic
import win32api
qtCreatorMainWindowFile = "map2.ui"
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorMainWindowFile)
class Map(QtBaseClass, Ui_MainWindow):
NUM_OF_COLS = 30
NUM_OF_ROWS = 30
def __init__(self):
QtBaseClass.__init__(self)
self.setupUi(self)
self.window_max_width = win32api.GetSystemMetrics(0) * 3/4
self.window_max_height = win32api.GetSystemMetrics(1) * 3/4
self.buttons = []
for row in range(self.NUM_OF_ROWS):
self.buttons_row = []
for col in range(self.NUM_OF_COLS):
self.buttons_row.append(QtGui.QPushButton())
self.buttons_row[-1].setText(str(col)+","+str(row))
self.buttons_row[-1].setMaximumWidth(35)
self.mapGridLayout.addWidget(self.buttons_row[-1], row, col)
self.buttons.append(self.buttons_row)
# Should only be called after "show" for geometry fields to be updated
def resize_scroll_area(self):
self.mapScrollArea.setMinimumWidth(self.mapScrollAreaWidgetContents.sizeHint().width() + self.buttons[0][0].x())
self.mapScrollArea.setMinimumHeight(self.mapScrollAreaWidgetContents.sizeHint().height() + self.buttons[0][0].y())
def resizeEvent(self, event):
if (self.width() > self.window_max_width) or (self.height() > self.window_max_height):
self.mapScrollArea.setMinimumHeight(0)
self.mapScrollArea.setMinimumWidth(0)
self.setMaximumHeight(self.window_max_height)
self.setMaximumWidth(self.window_max_width)
return super(Map, self).resizeEvent(event)
def show(self):
ret = super(Map, self).show()
self.move(0, 0)
self.resize_scroll_area()
return ret
# --------- Main code ----------
app = QtGui.QApplication(sys.argv)
map = Map()
map.show()
sys.exit(app.exec_())