日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

發布時間:2025/3/15 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_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及对象在哪个线程创建)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。