Qt工作笔记-对QThread使用的进一步认识(exec及对象在哪个线程创建)
生活随笔
收集整理的這篇文章主要介紹了
Qt工作笔记-对QThread使用的进一步认识(exec及对象在哪个线程创建)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
?
?
基本概念
代碼與實例
?
基本概念
這里有個官方例子,如下:
class WorkerThread : public QThread{Q_OBJECTvoid 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_NAMESPACEclass 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_Htransformthread.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"; }?
總結
以上是生活随笔為你收集整理的Qt工作笔记-对QThread使用的进一步认识(exec及对象在哪个线程创建)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot关于thymele
- 下一篇: 软考系统架构师笔记-最后知识点总结(五)