Не получается послать сигнал в другой класс
У меня есть три окна:
- первое - главное окно приложения,
- второе окно приложения, и
- третье окно, которое находится в отдельном классе.
В каждом из них есть по кнопке: кнопка в главном окне открывает мини окно, которое в отдельном классе, поверх основного окна.
Кнопка, которая находится в мини окне, должна закрыть мини окно и запустить второе окно приложения.
Решил использовать pyqtSignal для решения этой задачи, но выскакивает следующая ошибка:
Traceback (most recent call last):
File "d:/Python/test/main.py", line 55, in <module>
application = App()
File "d:/Python/test/main.py", line 29, in __init__
self.init_UI()
File "d:/Python/test/main.py", line 38, in init_UI
self.mysignal.connect(self.second_UI)
AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'
Надеюсь на вашу помощь!
main.py
import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QWidget
import main_ui
import mini_ui
import second_ui
class Mini_UI(QWidget):
def __init__(self):
super(Mini_UI, self).__init__()
self.init_UI()
def init_UI(self):
self.mini_ui = mini_ui.Ui_Form()
self.mini_ui.setupUi(self)
self.mini_ui.pushButton.clicked.connect(self.close)
self.mini_ui.pushButton.clicked.connect(self.show_second_ui)
def show_second_ui(self):
App().mysignal.emit() ######
class App(QtWidgets.QMainWindow):
def __init__(self):
super(App, self).__init__()
self.init_UI()
def init_UI(self):
self.main_ui = main_ui.Ui_MainWindow()
self.main_ui.setupUi(self)
self.main_ui.pushButton.clicked.connect(self.show_mini_ui)
self.mysignal = QtCore.pyqtSignal() ######
self.mysignal.connect(self.second_UI) ######
def second_UI(self):
self.second_ui = second_ui.Ui_MainWindow()
self.second_ui.setupUi(self)
self.second_ui.pushButton.clicked.connect(self.init_UI)
def show_mini_ui(self):
self.mini_window = Mini_UI()
self.mini_window.show()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
application = App()
application.show()
sys.exit(app.exec())
main_ui.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(210, 50, 351, 131))
font = QtGui.QFont()
font.setPointSize(26)
self.label.setFont(font)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(240, 230, 291, 111))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "ПЕРВОЕ ОКНО"))
self.pushButton.setText(_translate("MainWindow", "PushButton"))
second_ui.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(210, 50, 351, 131))
font = QtGui.QFont()
font.setPointSize(26)
self.label.setFont(font)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(240, 230, 291, 111))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "ВТОРОЕ ОКНО"))
self.pushButton.setText(_translate("MainWindow", "PushButton"))
mini_ui.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 300)
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(120, 100, 131, 71))
self.pushButton.setObjectName("pushButton")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.pushButton.setText(_translate("Form", "PushButton"))
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я отметил для вас строки, в которые надо внести изменения. Если что-то не понятно - спросите.
import sys
from PyQt5 import QtWidgets, QtGui, QtCore
# import main_ui # ---
# from main_ui import Ui_MainWindow # +++
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(210, 50, 351, 131))
font = QtGui.QFont()
font.setPointSize(26)
self.label.setFont(font)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(240, 230, 291, 111))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "ПЕРВОЕ ОКНО"))
self.pushButton.setText(_translate("MainWindow", "PushButton"))
#import mini_ui
# from mini_ui import Ui_Form # +++
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 300)
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(120, 100, 131, 71))
self.pushButton.setObjectName("pushButton")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.pushButton.setText(_translate("Form", "PushButton"))
#import second_ui
# from second_ui import Ui_SecondWindow # +++
#class Ui_MainWindow(object):
class Ui_SecondWindow(object): # +++ Ui_SecondWindow, Ui_MainWindow уже есть
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(210, 50, 351, 131))
font = QtGui.QFont()
font.setPointSize(26)
self.label.setFont(font)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(240, 230, 291, 111))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "ВТОРОЕ ОКНО"))
self.pushButton.setText(_translate("MainWindow", "PushButton"))
class Mini_UI(QtWidgets.QWidget):
mysignal = QtCore.pyqtSignal() # !!!
def __init__(self):
super(Mini_UI, self).__init__()
self.init_UI()
def init_UI(self):
self.mini_ui = Ui_Form()
self.mini_ui.setupUi(self)
self.mini_ui.pushButton.clicked.connect(self.close)
self.mini_ui.pushButton.clicked.connect(self.show_second_ui)
def show_second_ui(self):
# App().mysignal.emit()
self.mysignal.emit() # !!!
class App(QtWidgets.QMainWindow):
def __init__(self):
super(App, self).__init__()
self.init_UI()
def init_UI(self):
self.main_ui = Ui_MainWindow()
self.main_ui.setupUi(self)
self.main_ui.pushButton.clicked.connect(self.show_mini_ui)
# self.mysignal = QtCore.pyqtSignal()
# self.mysignal.connect(self.second_UI)
def second_UI(self):
# self.second_ui = Ui_MainWindow() # ---
self.second_ui = Ui_SecondWindow() # +++
self.second_ui.setupUi(self)
self.second_ui.pushButton.clicked.connect(self.init_UI)
def show_mini_ui(self):
self.mini_window = Mini_UI()
self.mini_window.mysignal.connect(self.second_UI) # !!!
self.mini_window.show()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
application = App()
application.show()
sys.exit(app.exec_())
