Emit () Сигнал другому классу не работает - PullRequest
1 голос
/ 25 апреля 2019

В настоящее время я работаю над графическим интерфейсом с PyQt5 (я нуб, когда дело доходит до Python и Qt), и мне нужно излучать сигнал из одного класса в другой.

Я читал об этом ипогуглил, а также нашел много полезных вещей, но они все еще не работают для меня.

Это мой кодовый манекен:

Номер класса 1:

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import Class2


class Class1(QWidget):
    eventButtonPressed = pyqtSignal(str)

    def __init__(self, parent=None):
        super().__init__(parent)
        self.Class1Btn = QPushButton('Button')
        self.Class1Edit = QLineEdit(self)

        self.Class1Btn.clicked.connect(self.clicked)

        # Layout stuff to mimic my real program
        self.Class1Grid = QGridLayout(self)
        self.Class1Grid.addWidget(self.Class1Btn)
        self.Class1Grid.addWidget(self.Class1Edit)
        self.groupBoxLayout1 = QGroupBox(self)
        self.groupBoxLayout1.setLayout(self.Class1Grid)

    def clicked(self):
        self.eventButtonPressed.emit(self.Class1Edit.text())

Класс Nr.2:

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import Class1


class Class2(QWidget):
    def __init__(self):
        super().__init__()
        self.Class1OBJ = Class1.Class1(self)
        self.Class1OBJ.eventButtonPressed.connect(self.StuffWhenSignalIsEmitted)

        # Layout stuff to mimic my real program
        self.Class2Edit = QLineEdit(self)
        self.Class2Grid = QGridLayout(self)
        self.Class2Grid.addWidget(self.Class2Edit)
        self.groupBoxLayout2 = QGroupBox(self)
        self.groupBoxLayout2.setLayout(self.Class2Grid)

    def StuffWhenSignalIsEmitted(self, text):
        print('Text from Class 2 Widget: {}'.format(self.Class2Edit))
        print('Text from Class 1 Widget: {}'.format(text))

Мое главное окно:

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import Class1
import Class2


class MainWindow(QWidget, QApplication):
    def __init__(self):
        super().__init__()
        self.Class1OBJ = Class1.Class1()
        self.Class2OBJ = Class2.Class2()

        self.WinLayout = QVBoxLayout(self)
        self.WinLayout.addWidget(self.Class1OBJ.groupBoxLayout1)
        self.WinLayout.addWidget(self.Class2OBJ.groupBoxLayout2)
        self.setGeometry(1100, 300, 300, 300)
        self.setWindowTitle("GUI")
        self.show()


app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())

Я хочу, чтобы программа печатала операторы из метода StuffWhenSignalIsEmitted при нажатии кнопки (если онавозможно).Поэтому я хочу напечатать, что находится в LineEdit из первого класса, а также то, что находится в LineEdit из второго класса.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Кажется, что вы думаете, что если переменная имеет одно и то же имя в разных классах, это одна и та же переменная, потому что это не так, это разные объекты. Self.Class1OBJ в Class2 отличается от self.Class1OBJ в MainWindow.

Таким образом, решение состоит в том, чтобы просто создать единую личность. Class1OBJ:

Class2.py

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


class Class2(QWidget):
    def __init__(self):
        super().__init__()

        # Layout stuff to mimic my real program
        self.Class2Edit = QLineEdit(self)
        self.Class2Grid = QGridLayout(self)
        self.Class2Grid.addWidget(self.Class2Edit)
        self.groupBoxLayout2 = QGroupBox(self)
        self.groupBoxLayout2.setLayout(self.Class2Grid)

    def StuffWhenSignalIsEmitted(self, text):
        print('Text from Class 2 Widget: {}'.format(self.Class2Edit))
        print('Text from Class 1 Widget: {}'.format(text))

main.py

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import Class1
import Class2


class MainWindow(QWidget, QApplication):
    def __init__(self):
        super().__init__()
        self.Class1OBJ = Class1.Class1()
        self.Class2OBJ = Class2.Class2()
        # add the following line
        self.Class1OBJ.eventButtonPressed.connect(self.Class2OBJ.StuffWhenSignalIsEmitted)

        self.WinLayout = QVBoxLayout(self)
        self.WinLayout.addWidget(self.Class1OBJ.groupBoxLayout1)
        self.WinLayout.addWidget(self.Class2OBJ.groupBoxLayout2)

        self.setGeometry(1100, 300, 300, 300)
        self.setWindowTitle("GUI")
        self.show()


app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
0 голосов
/ 25 апреля 2019

Попробуйте:

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


class ClassTwo(QWidget):

    def __init__(self):
        super().__init__()
        self.classOneOBJ = ClassOne(self)                # + self
        self.classOneOBJ.eventButtonPressed.connect(self.StuffWhenSignalIsEmitted)

        layout = QGridLayout(self)
        layout.addWidget(self.classOneOBJ)

    def StuffWhenSignalIsEmitted(self, text):
        print('it worked ->{}'.format(text))
        # and do stuff with instance variables of an existing object

class ClassOne(QWidget):
    eventButtonPressed = pyqtSignal(str)

    def __init__(self, parent=None):
        super().__init__(parent)

        self.lineEdit = QLineEdit() 

        self.Btn = QPushButton('Button')            
        self.Btn.clicked.connect(self.clicked)

        layout = QGridLayout(self)
        layout.addWidget(self.lineEdit)
        layout.addWidget(self.Btn)

    def clicked(self):
        self.eventButtonPressed.emit(self.lineEdit.text())


if __name__ == '__main__':
     app = QApplication(sys.argv)
     main = ClassTwo()
     main.show()
     sys.exit(app.exec_())    

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...