Dominik
Dominik

Reputation: 99

PyQt5 - Open widget in MDI Area after clicked menu option

I did create in Qt Designer MainWindow Form and WidgetForm. In MainWindow Form i did add Mdi Area. How i can open my Devices Widget Form in MdiArea after clicked menu option ?

My main.py

from windows.devices import Ui_Form_device

 class Ui_MainWindow(object):

    def Devices(self):
        self.Form_device = QtWidgets.QWidget()
        self.ui = Ui_Form_device()
        self.ui.setupUi(self.Form_device)
        self.Form_device.show()

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(823, 681)

        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.centralwidget.setLayout(QtWidgets.QVBoxLayout(self.centralwidget))
        self.mdiArea = QtWidgets.QMdiArea(self.centralwidget)
        self.centralwidget.layout().addWidget(self.mdiArea)
        ...

        # menu : DEVICES
        self.actionDevices = QtWidgets.QAction(MainWindow)
        self.actionDevices.setObjectName("actionDevices")
        self.actionDevices.triggered.connect(self.Devices)

        ...


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

devices.py

class Ui_Form_device(object):
    def setupUi(self, Form_device):
        Form_device.setObjectName("Form_device")
        Form_device.resize(400, 300)
        self.label = QtWidgets.QLabel(Form_device)
        self.label.setGeometry(QtCore.QRect(100, 150, 111, 16))

Upvotes: 1

Views: 1523

Answers (2)

eyllanesc
eyllanesc

Reputation: 244301

It is recommended not to modify the class that is generated with the design made with Qt Designer, since if you make any change in the design you will overwrite a code losing the changes of the logical part. You must create a class that inherits from the widget selected in Qt Designer and fill it with the initial class.

Review the following for more recommendations:

going to the point, what you should do is use the addSubWindow() method, this returns a QMdiSubWindow, and you should show this new widget.

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

class DevicesForm(QtWidgets.QWidget, Ui_Form_device):
    def __init__(self, *args, **kwargs):
        QtWidgets.QWidget.__init__(self, *args, **kwargs)
        self.setupUi(self)

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, *args, **kwargs):
        QtWidgets.QMainWindow.__init__(self, *args, **kwargs)
        self.setupUi(self)
        self.actionaction.triggered.connect(self.add_devices)

    def add_devices(self):
        w = DevicesForm(self)
        sub = self.mdiArea.addSubWindow(w)
        w.show()


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

Upvotes: 2

Isma
Isma

Reputation: 15209

Try by calling mdiArea.addSubWindow() as follows:

def Devices(self):
    self.Form_device = QtWidgets.QWidget()
    self.ui = Ui_Form_device()
    self.ui.setupUi(self.Form_device)
    self.mdiArea.addSubWindow(self.Form_Device)

Upvotes: 1

Related Questions