【问题标题】:Sending a custom pyqtsignal from one main window to another将自定义 pyqtsignal 从一个主窗口发送到另一个主窗口
【发布时间】:2019-12-11 17:46:54
【问题描述】:

这里是初学者 python 编码器。我在 qt 设计器中创建了两个主窗口。在第一个窗口中,我有一个包含三个项目的组合框(cb)和一个按钮(Button1),在另一个窗口中,我有一个 LineEdit(编辑)。当我在第一个窗口中按下按钮时,我想在第二个主窗口中创建的 LineEdit 中显示文本(在组合框中选择的当前项目)。

我在网上看了几个例子,但我似乎找不到适合我的东西。所有示例都是通过在代码中构建窗口来完成的(与 Qt 设计器相反)。在 Qt 设计器上设计窗口的人似乎和我有同样的问题。

如果有人能告诉我如何使用 Qt 设计器中设计的窗口发送信号,我将不胜感激。这将真正解决我目前遇到的一个大瓶颈,并且我可以在我的代码的其他区域实施相同的策略。

import sys
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.uic import loadUi


class First_Window(QMainWindow):

    got_signal = pyqtSignal(str)

    def __init__(self):
        super(First_Window,self).__init__()
        loadUi('first_window.ui',self)
        self.setWindowTitle('First Window')
        self.Button1.clicked.connect(self.On_buttonclick_clicked)

    def On_buttonclick_clicked(self):
        self.got_signal.emit(self.cb.currentText())

class Second_Window(QMainWindow):

    def __init__(self):
        super(Second_Window, self).__init__()
        loadUi('second_window.ui', self)
        self.setWindowTitle('Second Window')
        self.dcc = First_Window()
        self.dcc.got_signal.connect(self.show_it)

    def show_it(self, the_signal):
        self.edit.setText(the_signal)
        print(the_signal)


if __name__ == "__main__":

    app = QApplication(sys.argv)
    fw = First_Window()
    fw.show()
    sw = Second_Window()
    sw.show()

    sys.exit(app.exec_())

此代码是我正在处理的代码的简化版本,但它们存在相同的问题。

【问题讨论】:

    标签: python pyqt pyqt5 qt-signals


    【解决方案1】:

    说明:

    主要问题是你创建了2个First_Window:

    • 你用来展示的,并且
    • 在 got_signal 和 show_it 之间建立连接的另一个。

    解决办法:

    只需创建一个显示的 First_Window 并建立连接:

    import sys
    from PyQt5.QtCore import pyqtSignal
    from PyQt5.QtWidgets import QApplication, QMainWindow
    from PyQt5.uic import loadUi
    
    
    class First_Window(QMainWindow):
    
        got_signal = pyqtSignal(str)
    
        def __init__(self):
            super(First_Window, self).__init__()
            loadUi("first_window.ui", self)
            self.setWindowTitle("First Window")
            self.Button1.clicked.connect(self.On_buttonclick_clicked)
    
        def On_buttonclick_clicked(self):
            self.got_signal.emit(self.cb.currentText())
    
    
    class Second_Window(QMainWindow):
        def __init__(self):
            super(Second_Window, self).__init__()
            loadUi("second_window.ui", self)
            self.setWindowTitle("Second Window")
    
        def show_it(self, the_signal):
            self.edit.setText(the_signal)
            print(the_signal)
    
    
    if __name__ == "__main__":
    
        app = QApplication(sys.argv)
        fw = First_Window()
        fw.show()
        sw = Second_Window()
        sw.show()
    
        fw.got_signal.connect(sw.show_it)
    
        sys.exit(app.exec_())
    

    【讨论】:

    • 太棒了!奇迹般有效!我的逻辑还在那里,但我在我的代码中应用了相同的策略,它看起来不错!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多