Qt工作笔记-对QThread使用的进一步认识(exec及对象在哪个线程创建)

583 篇文章 127 订阅

目录

 

 

基本概念

代码与实例


 

基本概念

这里有个官方例子,如下:

  class WorkerThread : public QThread
  {
      Q_OBJECT
      void run() override {
          QString result;
          /* ... here is the expensive or blocking operation ... */
          emit resultReady(result);
      }
  signals:
      void resultReady(const QString &s);
  };

  void MyObject::startWorkInAThread()
  {
      WorkerThread *workerThread = new WorkerThread(this);
      connect(workerThread, &WorkerThread::resultReady, this, &MyObject::handleResults);
      connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater);
      workerThread->start();
  }

从官方的例子中可以看到,在run里面emit,但是,如果要在run里面进行如果要new一个QTimer,这样就要启动事件exec(),不然信号会发不出的,如下:

void TransformThread::run()
{
    m_timeLine->start();
    QTimer *t = new QTimer;
    connect(t, SIGNAL(timeout()), this, SLOT(timeOutTest()));
    t->start(100);
    exec();
}

通过这样的代码就可以实现。

在QThread的构造函数中new()的对象,这个对象的创建在QThread被new的线程里面,

而在构造函数后面创建的对象,就在Thread中线程。

 

代码与实例

如下QThread代码

transformthread.h

#ifndef TRANSFORMTHREAD_H
#define TRANSFORMTHREAD_H

#include <QThread>
#include <QList>

QT_BEGIN_NAMESPACE
class QGraphicsItem;
class QTimeLine;
QT_END_NAMESPACE

class TransformThread : public QThread
{
    Q_OBJECT
public:
    TransformThread(QObject *object = nullptr);
    ~TransformThread();
    void run();
    void addListItem(QGraphicsItem *item);
    void closeThread();

public slots:
    void transformWay1(int value);
    void transformFinished();
    void timeOutTest();


private:
    QList<QGraphicsItem*> m_list;
    bool m_isRun;
    QTimeLine *m_timeLine;
    bool m_newTime;
};

#endif // TRANSFORMTHREAD_H

transformthread.cpp

#include "transformthread.h"
#include <QPointF>
#include <QTransform>
#include <QGraphicsItem>
#include <QPushButton>
#include <QTimeLine>
#include <QDebug>
#include <QTimer>

TransformThread::TransformThread(QObject *object):
    QThread(object)
{
    m_isRun = true;
    m_newTime = true;
    m_timeLine = nullptr;
}

TransformThread::~TransformThread()
{
    delete m_timeLine;
}

void TransformThread::run()
{
    while(m_isRun){

        //qDebug() << "123456";
        if(m_newTime){

            m_timeLine = new QTimeLine(500);
            m_timeLine->setFrameRange(0, 500);
            qDebug() << "123";
            connect(m_timeLine, SIGNAL(frameChanged(int)), this, SLOT(transformWay1(int)), Qt::DirectConnection);
            connect(m_timeLine, SIGNAL(finished()), this, SLOT(transformFinished()), Qt::DirectConnection);
            m_newTime = false;
            m_timeLine->start();
            //QTimer *t = new QTimer;
            //connect(t, SIGNAL(timeout()), this, SLOT(timeOutTest()));
            //t->start(100);
            exec();
        }
        //QThread::sleep(1);
    }
}

void TransformThread::addListItem(QGraphicsItem *item)
{
    m_list << item;
}

void TransformThread::closeThread()
{
    m_isRun = false;
}

void TransformThread::transformWay1(int value)
{
    qDebug() << "value: " << value;
    if(m_list.size() == 0)
        return;

    for(int i = 0; i < m_list.size(); i++){

        QPointF pt = m_list[i]->boundingRect().center();
        qreal angle = value / 2.0;
        QTransform transform;
        transform.translate(pt.x(), pt.y());
        transform.rotate(angle, Qt::XAxis);
        m_list[i]->setTransform(transform);
    }

}

void TransformThread::transformFinished()
{
    delete m_timeLine;
    m_newTime = true;
}

void TransformThread::timeOutTest()
{
    qDebug() << "11111111111111";
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值