我有一个PyQT5网络刮刀程序,它使用两个窗口。第二个窗口是一个配置窗口,您可以在其中输入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属性。
发布于 2021-07-20 11:40:09
通过小部件发送数据的正确方法是使用Qt的信号和插槽机制。
一旦您将所有内容适当地连接起来,事件(如单击SpiderConfWindow的按钮)将触发包含某些数据的信号的发射。该信号将由时隙处理--这可能是您MainWindow类中的一种方法,它知道如何处理数据。
由于我无法访问GUI的代码,下面是一个显示这种行为的最小示例。SubWindow小部件在单击MainWindow小部件中的按钮时生成,然后在单击submit按钮时发出submitClicked信号(字符串)。这个信号连接到MainWindow的on_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_())https://stackoverflow.com/questions/68453805
复制相似问题