1

I need your help with the following problem that I've encountered. I have two Python files, Main.py and Module.py, which need to communicate using PyQt5 signals. Here's the code:

Main.py

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

from MyGUI import main_window_GUI

from Modules import Module.py

class MainWindow(QMainWindow, main_window_GUI.Ui_main_window):
    def __init__(self):
        QMainWindow.__init__(self)
        main_window_GUI.Ui_main_window.__init__(self)
        self.setupUI(self)

        sub_win = QMdiSubWindow()
        sub_win.setWidget(Module.moduleWindow())
        self.mdi.addSubWindow(sub_win)

        # this part reports error saying:
        # 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'
        Module.moduleWindow.my_signal.connect(self.do_something)

    def do_something(self):
        pass

Module.py

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

from MyGUI import module_window_GUI

class moduleWindow(QMainWindow, module_window_GUI.Ui_module_window):
    my_signal = pyqtSignal()
    def __init__(self):
        QMainWindow.__init__(self)
        module_window_GUI.Ui_module_window.__init__(self)
        self.setupUI(self)

        # the rest is not important

    # what is important is th following function
    def closeEvent(self, event):
        # when the user closes this subwindow signal needs to
        # be emitted so that the MainWindow class knows that
        # it's been closed.
        self.my_signal.emit()
        event.accept()

Any kind of help is more than welcome. Thanks in advance.

Beller0ph0n
  • 105
  • 1
  • 2
  • 10

1 Answers1

0

You need to connect the signal from an instance of the moduleWindow class, and not from the class itself:

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

from MyGUI import main_window_GUI

from Modules import Module

class MainWindow(QMainWindow, main_window_GUI.Ui_main_window):
    def __init__(self):
        QMainWindow.__init__(self)
        main_window_GUI.Ui_main_window.__init__(self)
        self.setupUI(self)

        sub_win = QMdiSubWindow()
        module_window = Module.moduleWindow()
        sub_win.setWidget(module_window)
        self.mdi.addSubWindow(sub_win)

        module_window.my_signal.connect(self.do_something)

    @pyqtSlot()
    def do_something(self):
        pass

I would also recommend to decorate the do_something method with pyqtSlot as reported in the documentation

Daniele Pantaleone
  • 2,657
  • 22
  • 33