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";
				
文章目录1. 引言2. QThread 文档3. QThread::run 和 QObject::connect4. QObject::moveToThread()5. 使用场景对于子类化 Thread 的方式对于 worker move to thread 的方式 1. 引言 你会用QThread吗?有几种使用方式?这几种使用方式都在何种场景下使用?有什么需要注意的地方吗? 2. QThr...
近日,使用QThread,一些问题百思不得其解,看过大牛的文章,恍然大悟啊。 原文 http://hi.baidu.com/dbzhang800/item/c14c97dd15318d17e1f46f41 在文章开始之前加注一点,为和我一样Qt水平不高的朋友提醒一下。QThread::wait(),一直以来我以为它阻塞的是QThread对象,可是我现在明白,原来阻塞的是这个对象所在的线程...
QThread类提供了一个与平台无关的管理线程的方法。一个QThread对象管理一个线程QThread的执行从run()函数的执行开始,在Qt自带的QThread类中,run()函数通过调用exec()函数来启动事件循环机制,并且在线程内部处理Qt的事件。在Qt中建立线程的主要目的就是为了用线程来处理那些耗时的后台操作,从而让主界面能及时响应用户的请求操作。 QThread的... 3、start()函数启动线程,执行run函数 4、在run函数中设置标志位,通过标志位来return出run函数,(结束线程,自动发送finish()信号,通过这个信号可以响应一些信息)) 阅读 8,643 NSThread简介 NSThread是苹果官方提供面向对象操作线程的技术,简单方便,可以直接操作线程对象,不过需要自己控制线程的生命周期。在平时使用很少,最常用到的无非就是 [NSThread currentThread]获取当前线程。 NSThread使用 1、 实例初始化、属性和实例方法 //创建线程 NSThread *newThread = [[N #include "MainWindow.h" #include "ui_MainWindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)