|
发表于 2024-3-15 09:17:40
|
显示全部楼层
如果你的窗口A已经关闭,并且所有的按钮和相关方法都在窗口B中,那么你可以将线程类定义在窗口B中,以便在按钮方法中启动线程来处理耗时任务。下面是一个可能的解决方案,使用`QRunnable`和`QThreadPool`来实现多线程执行任务的方式。
- from PySide6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QPushButton, QLabel
- from PySide6.QtCore import QRunnable, QObject, Signal, Qt, QThreadPool
- class MyRunnable(QRunnable):
- def __init__(self):
- super().__init__()
- self.setAutoDelete(True)
- def run(self):
- # 在这里编写耗时的任务代码
- # ...
- # 任务完成后发射信号
- exclude_rules = {'1': exclude_rows, '2': exclude_cols}
- self.finished.emit(exclude_rules)
- finished = Signal(dict)
- class WindowB(QMainWindow):
- def __init__(self):
- super().__init__()
- self.threadpool = QThreadPool()
-
- self.label = QLabel("进度条")
- self.button = QPushButton("启动线程")
- self.button.clicked.connect(self.start_thread)
- layout = QVBoxLayout()
- layout.addWidget(self.label)
- layout.addWidget(self.button)
- central_widget = QWidget()
- central_widget.setLayout(layout)
- self.setCentralWidget(central_widget)
- def start_thread(self):
- # 创建并配置任务对象
- runnable = MyRunnable()
- runnable.finished.connect(self.on_operation_finished)
-
- # 将任务提交给线程池
- self.threadpool.start(runnable)
- def on_operation_finished(self, exclude_rules):
- # 在这里处理线程信号
- print("操作完成:", exclude_rules)
- # ...
- app = QApplication([])
- window_b = WindowB()
- window_b.show()
- app.exec()
复制代码
在这个示例中,我们定义了一个`MyRunnable`类,该类继承自`QRunnable`。在`run()`方法中编写了耗时的任务代码,并通过`finished`信号发射任务的结果。窗口B中的按钮方法`start_thread()`会创建并配置任务对象,然后将任务提交给线程池启动执行。当任务完成时,会触发信号`finished`,并在`on_operation_finished()`方法中处理任务的结果。
使用`QThreadPool`可以自动管理和调度多个任务的线程池,避免手动管理线程的复杂性。通过将任务对象提交给线程池,可以简化多线程的使用。希望这个解决方案能够帮助到你,如果还有其他问题,请随时提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|