【问题标题】:How to pass values from one window to another PyQT如何将值从一个窗口传递到另一个 PyQT
【发布时间】:2021-07-20 11:06:35
【问题描述】:

我有一个 PyQT5 webscraper 程序,它使用两个窗口。第二个窗口是一个配置窗口,您可以在其中输入要抓取的 url,但是我不知道如何实际返回 url,以便主窗口可以访问它。

class SpiderConfWindow(QMainWindow, Ui_SpiderSettings):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_SpiderSettings()
        self.ui.setupUi(self)
        self.ui.btnConfirm.clicked.connect(self.confirm)

    def confirm(self):
        return self.ui.entryUrl.text()


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.spider_conf_w = SpiderConfWindow()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.url = None
        self.ui.btnSpiderSettings.triggered.connect(self.spider_settings)

    def spider_settings(self):
        self.spider_conf_w.show()

我想让SpiderConfWindow.confirm设置MainWindow的url属性

【问题讨论】:

    标签: python python-3.x pyqt5


    【解决方案1】:

    跨小部件发送数据的正确方法是使用 Qt 的信号和槽机制。

    一旦你把所有东西都正确连接起来,一个事件(比如点击SpiderConfWindow的按钮)将触发一个包含一些数据的信号的发射。此信号将由 slot 处理 - 可能是您的 MainWindow 类中知道如何处理数据的方法。

    由于我无权访问您的 GUI 代码,这里有一个展示此行为的替代最小示例。 SubWindow 小部件在单击 MainWindow 小部件中的按钮时生成,然后在单击提交按钮时发出其 submitClicked 信号(字符串)。此信号连接到MainWindowon_sub_window_confirm,它作为处理传入数据的槽。

    import sys
    
    from PyQt5 import QtCore as qtc
    from PyQt5 import QtWidgets as qtw
    
    
    class SubWindow(qtw.QWidget):
        submitClicked = qtc.pyqtSignal(str)  # <-- This is the sub window's signal
        
        def __init__(self, parent=None):
            super().__init__(parent)
            layout = qtw.QVBoxLayout()
            self.setLayout(layout)
            self.line_edit = qtw.QLineEdit(placeholderText="Enter URL here:")
            self.btn = qtw.QPushButton("Submit")
            layout.addWidget(self.line_edit)
            layout.addWidget(self.btn)
            self.btn.clicked.connect(self.confirm)
    
        def confirm(self):  # <-- Here, the signal is emitted *along with the data we want*
            self.submitClicked.emit(self.line_edit.text())
            self.close()
    
    
    class MainWindow(qtw.QWidget):
        def __init__(self, parent=None):
            super().__init__(parent)
            self.sub_window = None  # placeholder attribute for the sub window
            layout = qtw.QVBoxLayout()
            self.setLayout(layout)
            self.label = qtw.QLabel("Current URL: None")
            self.btn = qtw.QPushButton("Get new URL...")
            layout.addWidget(self.label)
            layout.addWidget(self.btn)
            self.btn.clicked.connect(self.show_sub_window)
    
        def show_sub_window(self):  # <-- Here, we create *and connect* the sub window's signal to the main window's slot
            self.sub_window = SubWindow()
            self.sub_window.submitClicked.connect(self.on_sub_window_confirm)
            self.sub_window.show()
        
        def on_sub_window_confirm(self, url):  # <-- This is the main window's slot
            self.label.setText(f"Current URL: {url}")
    
    
    if __name__ == "__main__":
        app = qtw.QApplication(sys.argv)
        gui = MainWindow()
        gui.show()
        sys.exit(app.exec_())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多