Передача сигнала из переопределенного класса QWidget. Python 3
Имеется 2 окна, код для каждой создан в отдельных файлах.
В первом окне MainMenu есть кнопка self.btn_mainMenu с помощью которой передаются данные в self.label_getData окна Window. Для упрощения кода в окно Window передаются данные из self.line_edit_1.
В окне Window кнопка self.button должна передавать сигнал и запускать метод def func(self) класса MenuWindow окна MainMenu и изменять текст self.label_1 в MainMenu. Передать сигнал от кнопки у меня не получается.
Пример кода MainMenu:
from PyQt5.QtWidgets import QWidget, QFileDialog, QComboBox
from Window import MainWindow, MyBar
class Ui_Form0(object):
def setupUi0(self, Form0):
Form0.setObjectName("Form0")
Form0.setEnabled(True)
Form0.resize(400, 300)
Form0.setWindowOpacity(1.0)
Form0.setToolTipDuration(-1)
Form0.setStatusTip("")
Form0.setStyleSheet("background-color: rgb(255, 255, 255);")
self.label_1 = QtWidgets.QLabel('нажми на кнопку в экране <b>WINDOW</b>', Form0)
self.label_1.setGeometry(QtCore.QRect(20, 20, 380, 30))
self.line_edit_1 = QtWidgets.QLineEdit('введи ФИО участников', Form0)
self.line_edit_1.setGeometry(QtCore.QRect(20, 120, 380, 30))
self.btn_mainMenu = QtWidgets.QPushButton('SEND DATA', Form0)
self.btn_mainMenu.setGeometry(QtCore.QRect(150, 160, 100, 20))
self.retranslateUi(Form0)
QtCore.QMetaObject.connectSlotsByName(Form0)
def retranslateUi(self, Form0):
_translate = QtCore.QCoreApplication.translate
Form0.setWindowTitle(_translate("Form0", "Главное меню"))
class MenuWindow(QWidget, Ui_Form0):
def __init__(self):
super().__init__()
self.setupUi0(self)
self.MainWindow = MainWindow()
# из Виджета MyBar мы передаем сигнал о нажатии кнопки self.button и применяем метод self.func
# self.myBar = MyBar()
# self.myBar.button.clicked.connect(self.func)
self.btn_mainMenu.clicked.connect(self.sendData)
def func(self):
self.label_1.setText('КНОПКА нажата')
print('1')
def sendData(self):
self.MainWindow.label_getData.setText(self.line_edit_1.text())
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
ui0 = MenuWindow()
ui0.show()
sys.exit(app.exec_())
Пример кода Window:
from PyQt5 import QtWidgets
from PyQt5.Qt import *
class MyBar(QWidget):
def __init__(self, parent):
super(MyBar, self).__init__()
self.parent = parent
self.layout = QHBoxLayout(self)
self.layout.setContentsMargins(0, 0, 10, 0)
self.title = QLabel()
self.button = QtWidgets.QPushButton('КНОПКА')
self.button.setFixedSize(160, 25)
self.title.setFixedHeight(32)
self.title.setAlignment(Qt.AlignCenter)
self.layout.addWidget(self.title)
self.layout.addWidget(self.button)
self.start = QPoint(0, 0)
self.pressing = False
def resizeEvent(self, QResizeEvent):
super(MyBar, self).resizeEvent(QResizeEvent)
self.title.setFixedWidth(self.parent.width())
def mousePressEvent(self, event):
self.start = self.mapToGlobal(event.pos())
self.pressing = True
def mouseMoveEvent(self, event):
if self.pressing:
self.end = self.mapToGlobal(event.pos())
self.movement = self.end - self.start
self.parent.setGeometry(self.mapToGlobal(self.movement).x(),
self.mapToGlobal(self.movement).y(),
self.parent.width(),
self.parent.height())
self.start = self.end
def mouseReleaseEvent(self, QMouseEvent):
self.pressing = False
class MainWindow(QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.Content = QtWidgets.QFrame(self)
self.Content.setStyleSheet("background-color: grey;")
self.Content.setFrameShape(QtWidgets.QFrame.NoFrame)
self.Content.setFrameShadow(QtWidgets.QFrame.Raised)
self.horizontalLayout = QtWidgets.QHBoxLayout(self.Content)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setSpacing(0)
self.page_1 = QtWidgets.QWidget()
self.label_getData = QtWidgets.QLabel('ФИО участника', self.page_1)
self.label_getData.setFixedSize(400, 25)
self.label_getData.setStyleSheet("font-size: 20px;")
self.horizontalLayout.addWidget(self.page_1)
self.layout = QVBoxLayout(self)
self.myBar = MyBar(self)
self.layout.addWidget(self.myBar)
self.layout.addWidget(self.Content, 1)
self.layout.setContentsMargins(0, 0, 0, 0)
self.layout.setSpacing(0)
self.setMinimumSize(400, 200)
self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
self.show()```
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Попробуйте так:
q1299455_MainMenu.py
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
from q1299455_Window import MainWindow # --- , MyBar
class Ui_Form0(object):
def setupUi0(self, Form0):
Form0.setObjectName("Form0")
Form0.setEnabled(True)
Form0.resize(400, 300)
Form0.setWindowOpacity(1.0)
Form0.setToolTipDuration(-1)
Form0.setStatusTip("")
Form0.setStyleSheet("background-color: rgb(255, 255, 255);")
self.label_1 = QtWidgets.QLabel('нажми на кнопку в экране <b>WINDOW</b>', Form0)
self.label_1.setGeometry(QtCore.QRect(20, 20, 380, 30))
# +++ vvvvvvvvvvvvvvv
self.line_edit_1 = QtWidgets.QLineEdit(Form0, placeholderText='введи ФИО участников')
self.line_edit_1.setGeometry(QtCore.QRect(20, 120, 380, 30))
self.btn_mainMenu = QtWidgets.QPushButton('SEND DATA', Form0)
self.btn_mainMenu.setGeometry(QtCore.QRect(150, 160, 100, 20))
self.retranslateUi(Form0)
QtCore.QMetaObject.connectSlotsByName(Form0)
def retranslateUi(self, Form0):
_translate = QtCore.QCoreApplication.translate
Form0.setWindowTitle(_translate("Form0", "Главное меню - MenuWindow"))
class MenuWindow(QWidget, Ui_Form0):
def __init__(self):
super().__init__()
self.setupUi0(self)
# не обязательно добавлять vvvv . Сделал для автоматического закрытия окна Window
self.mainWindow = MainWindow(self) # + self
self.mainWindow.myBar.button.clicked.connect(self.button_clicked) # +++ !!!
self.btn_mainMenu.clicked.connect(self.sendData)
def func(self):
self.label_1.setText('КНОПКА нажата')
print('1')
def sendData(self):
self.mainWindow.label_getData.setText(self.line_edit_1.text())
def button_clicked(self): # +++
self.func() # +++
# void QAbstractButton::click()
# Выполняет click
# При необходимости излучаются все обычные сигналы, связанные с click.
# Если кнопка checkable, состояние кнопки переключается.
# Эта функция ничего не делает, если кнопка отключена.
self.btn_mainMenu.click() # +++
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
ui0 = MenuWindow()
ui0.show()
sys.exit(app.exec_())
q1299455_Window.py
from PyQt5 import QtWidgets
from PyQt5.Qt import *
class MyBar(QWidget):
def __init__(self, parent):
super(MyBar, self).__init__()
self.parent = parent
self.layout = QHBoxLayout(self)
self.layout.setContentsMargins(0, 0, 10, 0)
self.title = QLabel()
self.button = QtWidgets.QPushButton('КНОПКА')
self.button.setFixedSize(160, 25)
self.title.setStyleSheet("background-color: #B2AB8C;")
self.title.setFixedHeight(32)
self.title.setAlignment(Qt.AlignCenter)
self.layout.addWidget(self.title)
self.layout.addWidget(self.button)
self.start = QPoint(0, 0)
self.pressing = False
def resizeEvent(self, QResizeEvent):
super(MyBar, self).resizeEvent(QResizeEvent)
self.title.setFixedWidth(self.parent.width())
def mousePressEvent(self, event):
self.start = self.mapToGlobal(event.pos())
self.pressing = True
def mouseMoveEvent(self, event):
if self.pressing:
self.end = self.mapToGlobal(event.pos())
self.movement = self.end - self.start
self.parent.setGeometry(self.mapToGlobal(self.movement).x(),
self.mapToGlobal(self.movement).y(),
self.parent.width(),
self.parent.height())
self.start = self.end
def mouseReleaseEvent(self, QMouseEvent):
self.pressing = False
class MainWindow(QWidget):
def __init__(self, parent=None): # + parent
super(MainWindow, self).__init__(parent) # + parent
self.setMinimumSize(400, 200)
self.move(60, 180) # +
# vvvvvvvvv
self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
self.Content = QtWidgets.QFrame(self)
self.Content.setStyleSheet("background-color: grey;")
self.Content.setFrameShape(QtWidgets.QFrame.NoFrame)
self.Content.setFrameShadow(QtWidgets.QFrame.Raised)
self.horizontalLayout = QtWidgets.QHBoxLayout(self.Content)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setSpacing(0)
self.page_1 = QtWidgets.QWidget()
self.label_getData = QtWidgets.QLabel('ФИО участника', self.page_1)
self.label_getData.setFixedSize(400, 25)
self.label_getData.setStyleSheet("font-size: 20px;")
self.horizontalLayout.addWidget(self.page_1)
self.layout = QVBoxLayout(self)
self.myBar = MyBar(self)
self.layout.addWidget(self.myBar)
self.layout.addWidget(self.Content, 1)
self.layout.setContentsMargins(0, 0, 0, 0)
self.layout.setSpacing(0)
self.show()
