【问题标题】:Emit() a Signal to a different class isn't workingEmit() 向其他类发出信号不起作用
【发布时间】:2019-04-30 18:46:09
【问题描述】:

我目前正在使用 PyQt5 开发一个 GUI(我是 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())

第 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 方法的语句(如果可能的话)。所以我想打印 Class 1 的 LineEdit 中的内容,以及 Class2 的 LineEdit 中的内容。

【问题讨论】:

  • 错字:在super().__init__() 之后添加self.startButton(),因为您从未创建过您按下的按钮,并在self.classOneOBJ = ClassOne() 之后添加self.classOneOBJ.show(),因为您从未显示过新窗口。
  • 是的,谢谢。我更新了代码以使我的问题更清楚。

标签: python pyqt pyqt5


【解决方案1】:

您似乎认为如果一个变量在不同的类中具有相同的名称,那么它就是同一个变量,因为它们不是,它们是不同的对象。 Class2中的self.Class1OBJ与MainWindow中的self.Class1OBJ不同。

所以解决方法就是创建一个self.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))

ma​​in.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_())

【讨论】:

  • 谢谢你的解释!所以这意味着即使 LineEdit 中的文本始终存在,它也绑定到一个对象?我无法在任何 2 类对象的帮助下访问那里写的文本?
  • @FreddyKly 1. 这是另一个对象。 2.每个对象都是独立的,类比是指一个类是指相似元素的抽象,例如人类是一个类,我们都有一个名字你认为你可以通过向另一个人询问名字来得到我的名字吗?人?嗯,没有。所以类人,而对象人。
【解决方案2】:

试试看:

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_())    

【讨论】:

  • 非常感谢!您的代码运行良好,但我的改编仍然没有达到我想要的效果(我可能不理解某个概念)我将编辑我的帖子并添加新代码,希望能让问题更清晰。
猜你喜欢
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多