如何从另一个窗口在pyqt返回变量?

时间:2020-10-13 21:47:51

标签: python pyqt

我在PYQT中有一个主窗口和一个对话框。我在主窗口中收到用户的输入,然后打开对话框窗口并将输入传递给此窗口。

再次在对话框窗口中,我收到另一个输入,并将此新输入与我从主窗口传递的其他输入相加。

enter image description here

class MainWindow (QMainWindow):
    def __init__(self):
        super().__init__()
        self.window=Ui_MainWindow() 
        self.window.setupUi(self)   

     def open_qdialog_window(self):
        
        self.dialog_window = Qdialog(self.window.lineedit1.currentText())

        self.dialog_window .show()

class Qdialog(QDialog):
    def __init__(self,DS_parameter):
        super().__init__()
        
        self.DS_parameters=DS_parameters
        #UI file of oscilloscope
    
        self.window=Ui_Qdialog()
        self.window.setupUi(self)
        self.UI()
    
    def summation(self):
        self.DS_parameters=self.DS_parameters+self.window.lineedit2.currentText()

现在的问题是我如何才能将self.DS_parameters返回到主窗口并使用此新值更新editline1?

1 个答案:

答案 0 :(得分:1)

对我来说,很难就您的代码提供具体(可能更有帮助)的反馈,因为您共享的部分不完整。不过,我希望我比较笼统的回答对您有所帮助。

在 Qt 中,signals 用于在 GUI 元素之间建立连接。基本思想是事件触发函数的执行。例如,每当按下按钮时,就会更新一些文本。下面是一个说明如何将总和返回到主窗口并更新相应行的工作示例。

from PyQt5.QtWidgets import (
    QApplication,
    QMainWindow,
    QDialog,
    QWidget,
    QVBoxLayout,
    QLineEdit,
    QLabel,
    QPushButton
    )


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.user_input = QLineEdit()
        self.populate()
        self.show()

    def populate(self):
        widgets = [QLabel("Insert a number"), self.user_input]
        centralWidget = self.group_widgets(widgets)
        self.setCentralWidget(centralWidget)

    def group_widgets(self, widgets):
        parentWidget = QWidget()
        layout = QVBoxLayout()
        for widget in widgets: layout.addWidget(widget)
        parentWidget.setLayout(layout)
        return parentWidget

    def when_input(self, function):
        self.user_input.textChanged.connect(function)

class Dialog(QDialog):
    def __init__(self):
        super().__init__()
        self.user_input = QLineEdit()
        self.admin_input = QLineEdit("0")
        self.button = QPushButton("add")
        self.relay_sum = None  # function to relay result of addition
        self.populate()
        self.show()

    def populate(self):
        widgets = self.get_widgets()
        layout = self.get_layout(widgets)
        self.setLayout(layout)

    def get_widgets(self):
        widgets = [
            QLabel("Inserted number"),
            self.user_input,
            QLabel("Insert the second number"),
            self.admin_input,
            self.button
            ]
        return widgets

    def get_layout(self, widgets):
        layout = QVBoxLayout()
        for widget in widgets: layout.addWidget(widget)
        return layout

    def when_buttonReleased(self, function):
        self.relay_sum = function
        self.button.released.connect(self.process_input)

    def process_input(self):
        user_number = float(self.user_input.text())
        admin_number = float(self.admin_input.text())
        result = "%.2f" %(user_number + admin_number)
        self.relay_sum(result)

def main():
    app = QApplication([])
    mainWindow = MainWindow()
    dialog = Dialog()
    mainWindow.when_input(lambda text: dialog.user_input.setText(text))
    dialog.when_buttonReleased(lambda text: mainWindow.user_input.setText(text))
    app.exec_()

if __name__ == "__main__":
    main()

正如您所注意到的,我允许自己更改您建议的变量名称。在示例中,创建了两个窗口并建立了两个连接:

[1. connection] 每当主窗口的文本发生变化 (MainWindow.user_input.textChanged) 时,新文本将设置为对话窗口中相应行的内容 (Dialog.user_input. setText).

[2. connection] 每当对话框窗口中的按钮被释放 (Dialog.button.released),对话框窗口中的值就会相加,结果被设置为主窗口的文本 (MainWindow .user_input.setText).