Как достучаться до элемента в другом классе?
Например, я хочу изменить текст кнопки, привязав ее к функции из другого класса. Но я получаю сообщение об ошибке в строке
self.ui.pushButton.setText("OK"):
AttributeError: 'bool' object has no attribute 'ui'
main.py:
from PySide6.QtWidgets import QApplication, QWidget
import test_gui
class App(QWidget):
def __init__(self):
QWidget.__init__(self)
self.ui = test_gui.Ui_Form()
self.ui.setupUi(self)
self.ui.pushButton.clicked.connect(Second.func)
class Second(App):
def __init__(self):
App.__init__(self)
def func(self):
self.ui.pushButton.setText("OK")
if __name__ == "__main__":
app = QApplication([])
mw = App()
mw.show()
app.exec()
test_gui.py:
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
QMetaObject, QObject, QPoint, QRect,
QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
QFont, QFontDatabase, QGradient, QIcon,
QImage, QKeySequence, QLinearGradient, QPainter,
QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QPushButton, QSizePolicy, QWidget)
class Ui_Form(object):
def setupUi(self, Form):
if not Form.objectName():
Form.setObjectName(u"Form")
Form.resize(392, 279)
self.pushButton = QPushButton(Form)
self.pushButton.setObjectName(u"pushButton")
self.pushButton.setGeometry(QRect(120, 110, 75, 24))
self.retranslateUi(Form)
QMetaObject.connectSlotsByName(Form)
# setupUi
def retranslateUi(self, Form):
Form.setWindowTitle(QCoreApplication.translate("Form", u"Form", None))
self.pushButton.setText(QCoreApplication.translate("Form", u"PushButton", None))
# retranslateUi
Подскажите, пожалуйста, что я не так делаю?
Ответы (2 шт):
Автор решения: Alexander Chernin
→ Ссылка
Через сигналы/слоты (не путайте объект класса и сам класс):
from PySide6.QtCore import QObject, Signal, Slot
class App(QWidget):
# Сигнал
clicked = Signal()
def __init__(self):
QWidget.__init__(self)
self.ui = test_gui.Ui_Form()
self.ui.setupUi(self)
# Вызываем сигнал
self.ui.pushButton.clicked.connect(self.clicked.emit)
class Second(App):
def __init__(self):
App.__init__(self)
@Slot()
def func(self):
self.ui.pushButton.setText("OK")
if __name__ == "__main__":
app = QApplication([])
mw = App() # Первое окно
sec = Second() # Второе окно
# Соединяем сигнал со слотом
mw.clicked.connect(sec.func)
mw.show()
sec.show()
app.exec()
Автор решения: S. Nick
→ Ссылка
Как вариант:
'''
from PySide6.QtWidgets import QApplication, QWidget
...
'''
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
#from test_gui import Ui_Form
class Ui_Form(object):
def setupUi(self, Form):
if not Form.objectName():
Form.setObjectName(u"Form")
Form.resize(392, 279)
self.pushButton = QPushButton(Form)
self.pushButton.setObjectName(u"pushButton")
self.pushButton.setGeometry(QRect(120, 110, 75, 24))
self.retranslateUi(Form)
QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
Form.setWindowTitle(QCoreApplication.translate("Form", u"Form", None))
self.pushButton.setText(QCoreApplication.translate("Form", u"PushButton", None))
class Second(): ## ??? (App):
def __init__(self, parent=None): # +++ parent
super().__init__()
self.parent = parent # +++ parent
def func(self):
if self.parent.pushButton.text() == "OK":
self.parent.pushButton.setText("PushButton")
else:
self.parent.pushButton.setText("OK") # +++ parent
class App(QWidget, Ui_Form):
def __init__(self):
super().__init__()
# QWidget.__init__(self)
# self.ui = test_gui.Ui_Form()
# self.ui.setupUi(self)
# self.ui.pushButton.clicked.connect(Second.func)
self.setupUi(self)
# создайте экзкмпляр класса !!!
self.second = Second(self) # +++ (self)
# self.pushButton.clicked.connect(Second.func)
self.pushButton.clicked.connect(self.second.func) # +++ (self.second.func)
if __name__ == "__main__":
app = QApplication([])
mw = App()
mw.show()
app.exec()

