目录
基本概念
这里有个官方例子,如下:
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";
}