日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發(fā)布時間:2025/3/15 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt工作笔记-对QThread使用的进一步认识(exec及对象在哪个线程创建) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

?

?

基本概念

代碼與實例


?

基本概念

這里有個官方例子,如下:

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(),不然信號會發(fā)不出的,如下:

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

通過這樣的代碼就可以實現(xiàn)。

在QThread的構造函數(shù)中new()的對象,這個對象的創(chuàng)建在QThread被new的線程里面,

而在構造函數(shù)后面創(chuàng)建的對象,就在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_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"; }

?

總結

以上是生活随笔為你收集整理的Qt工作笔记-对QThread使用的进一步认识(exec及对象在哪个线程创建)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。