QT子线程操作UI

在QT中,子线程是无法直接操作UI的,否则会报错,会出现线程冲突之类的错误。

可以用两种方法实现:

1)使用信号和操操作,子线程给UI所在的主线程发信号;

2)使用InvokeMethod方法。

方法样例如下:

threadtest.h

#ifndef THREADTEST_H
#define THREADTEST_H

#include <QThread>
#include <QProgressDialog>

class MainWindow;

class  QThreadTest: public QThread
{
    Q_OBJECT
public:
    QThreadTest(MainWindow *mainwnd);
    ~QThreadTest();

    virtual void run();
private:
    QProgressDialog* m_pQProgressDlg;
    //MainWindow *m_pMainWindow;
};

#endif // THREADTEST_H

threadtest.cpp

#include "threadtest.h"

QThreadTest::QThreadTest(MainWindow *mainwnd)
{
    //this->m_pMainWindow = mainwnd;
    m_pQProgressDlg = new QProgressDialog();
    //m_pQProgressDlg->setLabel("测试");
}

QThreadTest::~QThreadTest()
{
    if(m_pQProgressDlg != NULL)
    {
        delete m_pQProgressDlg;
        m_pQProgressDlg = NULL;
    }
}

void QThreadTest::run()
{
    QMetaObject::invokeMethod(m_pQProgressDlg, "show", Qt::QueuedConnection);
    //m_pQProgressDlg->show();
    //usleep(200000);
    sleep(30);

    //QMetaObject::invokeMethod(m_pQProgressDlg, "hide", Qt::QueuedConnection);
    QMetaObject::invokeMethod(m_pQProgressDlg, "hide", Qt::QueuedConnection);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值