Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to load second .ui into self with PyQt4.uic.loadUi?

I'm creating an application which loads a couple of .ui files. The first one is of type QMainWindow and the others are of type QWidget.

I can't figure out how to load the second UI (module.ui) into self, making widgets accessible through self.<widget_name>.

How can this be achieved?

from PyQt4 import QtGui
from PyQt4 import uic


class TestApp(QtGui.QMainWindow):
    def __init__(self):
        super(TestApp, self).__init__()

        # Load main window and the module
        uic.loadUi('main_window.ui', self)  # QMainWindow, contains testLayout, loads into self
        ui_module = uic.loadUi('module.ui')  # QWidget

        # Attach module to main window
        self.testLayout.addWidget(ui_module)  # this works fine

        # Edit widget in UI module
        self.label.setText('Hello')  # does not work (since self.label doesn't exist)

I could do this:

self.label = ui_module.label
self.label.setText('Hello')

...but I'd like to instead load the UI into self from the start.

If I try to load the UI into self, I get an error:

uic.loadUi('module.ui', self)
>>> QLayout: Attempting to add QLayout "" to TestApp "Form", which already has a layout
like image 658
fredrik Avatar asked Oct 14 '25 09:10

fredrik


1 Answers

You need to create a widget to load the ui file onto

self.widget = QWidget(self)
uic.loadUi('module.ui', self.widget)

self.widget.label.setText('Hello')

That being said, it would probably be better if you created a separate class for the other widget.

class MyWidget(QWidget):
    def __init__(self, **args, **kwargs):
        super(MyWidget, self).__init__(*args, **kwargs)
        uic.loadUi('module.ui', self)
        self.label.setText('Hello')

class TestApp(QtGui.QMainWindow):
    def __init__(self):
        ...
        self.widget = MyWidget(self)
like image 159
Brendan Abel Avatar answered Oct 16 '25 23:10

Brendan Abel