Qt多线程简单使用

8 篇文章 1 订阅

1.work.h

#ifndef WORK_H
#define WORK_H

#include <QObject>
#include "QImage"

class Work : public QObject
{
    Q_OBJECT
public:
    explicit Work(QObject *parent = nullptr);

signals:
    void ImageDone(QImage image);

public slots:
    void slotDrawImage();
};

#endif // WORK_H

2.work.cpp

#include "work.h"
#include "QPainter"
#include <QtGlobal>
#include "QPoint"

Work::Work(QObject *parent) : QObject(parent)
{

}

void Work::slotDrawImage()
{
    QImage image(600,600,QImage::Format_ARGB32);
    QPainter painter(&image);
    QPoint pt[] =
            {
                QPoint(qrand()%590, qrand()%590),
                QPoint(qrand()%590, qrand()%590),
                QPoint(qrand()%590, qrand()%590),
                QPoint(qrand()%590, qrand()%590),
                QPoint(qrand()%590, qrand()%590),
            };

    painter.drawPolygon(pt,5);
    emit ImageDone(image);
}

3.mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>

namespace Ui {
class MyWidget;
}

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    explicit MyWidget(QWidget *parent = nullptr);
    ~MyWidget();

private:
    Ui::MyWidget *ui;
    QImage m_image;

protected:
    void paintEvent(QPaintEvent *);
};

#endif // MYWIDGET_H

4.mywidget.cpp

#include "mywidget.h"
#include "ui_mywidget.h"
#include "work.h"
#include <QThread>
#include <QPainter>

MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyWidget)
{
    ui->setupUi(this);

    Work* pWork = new Work; //这里不能给pwork指明父对象,不然效果会出错
        connect(ui->draw, &QPushButton::clicked,
    pWork, &Work::slotDrawImage);

        QThread * pthread = new QThread(this);
        // 将操作移入子线程中处理
        pWork->moveToThread(pthread);
        // 启动子线程
        pthread->start();

        connect(pWork, &Work::ImageDone, [=](QImage image)
        {
             // 保存图片
            m_image = image;
             // 刷新窗口
            update();
        });

        connect(this, &MyWidget::destroyed, [=]()
        {
            // 退出线程
            pthread->quit();
            pthread->wait();
            delete pWork;
        });

}

void MyWidget::paintEvent(QPaintEvent *e)
{
    QPainter p(this);
    p.drawImage(0, 0, m_image);
}


MyWidget::~MyWidget()
{
    delete ui;
}

多线程使用注意事项:

1.线程不能操作UI对象(比如从QWidget直接或间接派生的窗口对象)

2.需要移动到子线程中处理的模块类,创建类对象的时候不能指定父对象

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt提供了一些类来支持多线程编程,其中最常用的是QThread和QThreadPool。 QThread类是Qt中最基本的多线程实现类,它提供了一个线程对象,可以通过继承QThread类并实现run()方法来创建自己的线程。 下面是一个简单的例子: ```cpp class MyThread : public QThread { public: void run() override { // 在这里编写线程运行的代码 } }; // 创建线程对象并启动 MyThread thread; thread.start(); ``` 在这个例子中,我们继承了QThread类,并重写了它的run()方法,run()方法中编写的代码将在新线程中运行。然后,我们创建了一个MyThread对象,并通过调用start()方法来启动线程。 除了QThread外,Qt还提供了QThreadPool类来管理多个线程QThreadPool类可以创建多个线程,并将任务分配给这些线程来执行。QThreadPool使用线程池技术来提高多线程应用程序的性能。 下面是一个简单的例子: ```cpp QThreadPool *pool = QThreadPool::globalInstance(); // 获取全局线程池对象 // 创建任务 QRunnable *myTask = new MyTask(); // 将任务添加到线程池中 pool->start(myTask); ``` 在这个例子中,我们获取了全局线程池对象,并创建了一个MyTask对象作为任务。然后,我们将任务添加到线程池中,并由线程池来决定将任务分配给哪个线程来执行。 需要注意的是,多线程编程涉及到许多复杂的问题,如线程安全、锁、信号与槽等,需要仔细设计和考虑。在使用多线程时,应该遵循一些基本的原则,如避免共享资源、避免阻塞操作等,以确保程序的正确性和性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值