moveToThread简单使用方法

Qt的多线程实现可分为两种实现方法,其一为继承QThread,并重写其run函数以实现多线程,而另一种则是本文将介绍的moveToThread,即将继承QObject中的类通过moveToThread函数来转移至一个Thread中以实现多线程。

代码说明

首先先自定义一个类Threadwork继承QObject,并在类中定义一个让子线程来实现的函数thread:

class Threadwork : public QObject
{
    Q_OBJECT
public:
    Threadwork();
public slots:
    void thread();


};

之后就可以在Threadwork.c中去查看相应的构造函数以及成员函数的线程Id:

Threadwork::Threadwork()
{
    qDebug()<<"主线程:"<<QThread::currentThreadId();
}
void Threadwork::thread()
{
    qDebug()<<"子线程:"<<QThread::currentThreadId();
}

在mainwindow.h中定义了相关信号以及变量


class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
signals:
    void work();

private:
    Ui::MainWindow *ui;
    QThread *SonThread;
    Threadwork *MainThread;

};

最后就可以在mainwindow.c中实现多线程的使用。构建信号与槽函数,使用moveToThread构建子线程。

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ChildThread= new QThread;
    MainThread = new Threadwork;
    connect(this,SIGNAL(work()),MainThread,SLOT(thread()));
    MainThread -> moveToThread(ChildThread);
    ChildThread-> start();
    emit work();

}

最终显示出子线程确实与主线程不在同一线程。
在这里插入图片描述

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 PyQt 中使用 `moveToThread` 的步骤如下: 1. 创建一个 `QThread` 对象。 2. 创建一个 `QObject` 对象,该对象将在新线程中运行。 3. 将该对象移动到新线程中,可以使用 `moveToThread` 方法。 4. 在新线程中启动该对象,可以使用 `start` 方法。 下面是一个简单的示例代码: ```python import sys from PyQt5.QtCore import QThread, QObject, pyqtSignal, pyqtSlot from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton class Worker(QObject): finished = pyqtSignal() @pyqtSlot() def do_work(self): # do some heavy work here self.finished.emit() class MainWindow(QMainWindow): def __init__(self): super().__init__() self.button = QPushButton("Start", self) self.button.clicked.connect(self.start_worker) self.worker_thread = QThread() self.worker = Worker() self.worker.moveToThread(self.worker_thread) self.worker.finished.connect(self.worker_thread.quit) self.worker.finished.connect(self.worker.deleteLater) self.worker_thread.finished.connect(self.worker_thread.deleteLater) def start_worker(self): self.worker_thread.start() self.worker.finished.connect(self.on_worker_finished) self.worker_thread.started.connect(self.worker.do_work) @pyqtSlot() def on_worker_finished(self): self.button.setText("Finished") self.worker_thread.quit() if __name__ == "__main__": app = QApplication(sys.argv) main_window = MainWindow() main_window.show() sys.exit(app.exec_()) ``` 在这个例子中,我们创建了一个 `Worker` 类,它包含一个 `do_work` 方法,该方法会在新线程中运行。然后,我们创建了一个 `MainWindow` 类,它包含一个按钮,点击该按钮将启动 `Worker` 对象。 在 `MainWindow` 的构造函数中,我们创建了一个 `QThread` 对象和一个 `Worker` 对象。我们将 `Worker` 对象移动到 `QThread` 中,然后连接信号和槽来处理线程的结束和对象的删除。 在 `start_worker` 方法中,我们启动 `QThread`,并将信号和槽连接起来,以便在新线程中调用 `do_work` 方法。 最后,在 `on_worker_finished` 方法中,我们更新按钮的文本,并停止 `QThread`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值