Main Window resize in Python with Qt

I have a gui in ui_main.py file (designed in Qt Designer). I load it in my main *.py file in this way:

from PyQt4 import QtGui, QtCore
from ui_main import Ui_MainWindow
class MyForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
...

ui_main.py file:

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(667, 559)

I need to resize my main window during application start. My main problem is that I can't get access to Main window object.

 self.ui.MainWindow.resize(300,300)
 AttributeError: 'Ui_MainWindow' object has no attribute 'MainWindow'

If I add to ui_main.py file:

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        self.uiui = MainWindow

I can resize my main window with:

self.ui.uiui.resize(300,300) 

But I know that it's very bad to edit generated ui file. How can I resize my main window without editing a gui file?


Solution 1:

The ui module created by pyuic (via Qt Designer) is just a simple helper class with a couple of initialization methods.

Both methods take an instance of the top-level ui class from Qt Designer (usually a QMainWindow), and then add the all the ui elements to that instance. This ensures that everything created in Qt Designer is accessible from the top-level widget.

So your MyForm subclass passes self (an instance of QMainWindow) to setupUi, which then becomes the MainWindow variable you see in your ui file.

This means you can resize your main window by simply doing:

self.resize(300, 300)