|  | 
 
 发表于 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 小助理,如未能正确解答您的问题,请继续追问。
 | 
 |