使用QT搭建点云显示框架系列三——QThread与QProgressbar

我们直接上干货,废话不多说。本文代码不会用的同学加我QQ 498771026

这一次是对上一篇文章的改进,不清楚怎么回事的童鞋们可以复习一下我的上一篇文章了

http://blog.youkuaiyun.com/qq_30547073/article/details/79038655

好那么这一次要搞事的是QThread。

用过CloudCompare的同学们都知道,读取点云的时候它会跳一个进度条出来,读取结束后进度条消失,然后点云显示出来。我想要的效果和它一样,而且已经实现了。而在这之前,笔者一点多线程的知识也没有。好我们先上效果:


测试PLY点云.rar 也已经分享到网盘里面了,请大家积极下载吧。

链接:https://pan.baidu.com/s/1i5MRSbF 密码:ku8f

笔者首先参照的是这篇文章

http://blog.youkuaiyun.com/liang19890820/article/details/52186626

经过分析之后,笔者决定继承QThread类,然后将读取文件部分放到QThread的子类里面完成,随着文件的一行一行读取,不停地发送信号给主窗体,主窗体可以先show一个QProgressBar出来,然后这个进度条的值就可以随着信号传出来的值而进行更改了。

除此之外,如果你觉得上面那个框架太大了,没法看,没关系,本人写了一个测试用的 QThredStudy程序,也和网盘分享在一起了。叫做QThredStudy,同学们也可以下下来看看。重申,不会用的加我QQ 598771026

效果是这样的:


核心代码如下:

首先是继承自QThred的类:

class WorkerThread : public QThread
{
    Q_OBJECT

public:
    WorkerThread(QString PathToRead, QObject *parent = 0);
    QList<QString> ReturenQList();
protected:

    virtual void run() Q_DECL_OVERRIDE;
signals:
    void signal_SetMaxVal(int);
    void resultReady(int);
public slots:

private:
    QString m_Path;
    QList<QString>m_StrList;
};
#endif // OHMYTHRED_H
然后是它的实现:

 WorkerThread::WorkerThread(QString PathToRead,QObject *parent)
    : QThread(parent)
{
    qDebug() << "Worker Thread : " << QThread::currentThreadId();
    m_Path = PathToRead;
}

void WorkerThread::run()
{
    QFile file(m_Path);
    if (!file.open(QFile::ReadOnly))
        return ; //we clear already initialized data
    //m_myThred-> SetMaximum();
    QTextStream stream(&file);
    int PtNum;
    QString currentLine;
    do
    {
        currentLine = stream.readLine();
        QStringList sections = currentLine.split(QRegExp("[ ]"));
        QString firstStr =sections[0].trimmed();
        if(firstStr == QString("ply"))
        {

        }
        else if(firstStr == QString("format"))
        {

        }
        else if(firstStr == QString("element"))
        {
            QString PtNumStr = sections[sections.size()-1];
            PtNum =PtNumStr.toDouble();
            emit(signal_SetMaxVal(PtNum));
        }
    }while (!currentLine.isNull()&&
            currentLine!=QString("end_header"));

    m_StrList.clear();
    qDebug() << "Worker Run Thread : " << QThread::currentThreadId();
    do
    {
        if(m_StrList.size() ==PtNum)
            break;
        currentLine = stream.readLine();
        QStringList sections = currentLine.split(QRegExp("[ ]"));
        m_StrList.push_back(currentLine);
        emit(resultReady(m_StrList.size()));
    }while(!currentLine.isNull());

//    int nValue = 0;
//    while (nValue < maxVal)
//    {
//        // 休眠50毫秒
//        msleep(50);
//        ++nValue;
//        // 准备更新
//        //m_ProgressBar->setValue(nValue);
//        emit resultReady(nValue);
//    }
}

QList<QString> WorkerThread::ReturenQList()
{
    return m_StrList;
}
主窗体h文件代码:
#ifndef QTHREDSTUDYMAINWINDOW_H
#define QTHREDSTUDYMAINWINDOW_H

#include <QMainWindow>
#include<QTextStream>
#include<QDir>
#include<QFile>
#include<QProgressBar>
#include<QProgressDialog>
#include"ohmythred.h"
namespace Ui {
class QThredStudyMainWindow;
}

class QThredStudyMainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit QThredStudyMainWindow(QWidget *parent = 0);
    ~QThredStudyMainWindow();

private slots:
    void on_actionThredTest_triggered();
    void on_action2_triggered();

    void slot_HandleResults(int value);
    void slot_startThread();
    void slot_thisFinished();
    void slot_GetMaxVal(int);
signals:
    void signal_ReadLine(int);
    void signal_setVal(int);
private:

    void Start();
    void do_ReadFile();
    Ui::QThredStudyMainWindow *ui;
    OhMyThred* m_myThred;
    QProgressBar *m_pProgressBar;
    WorkerThread *m_workerThread;
};

#endif // QTHREDSTUDYMAINWINDOW_H
然后是主窗体CPP代码:

#include "qthredstudymainwindow.h"
#include "ui_qthredstudymainwindow.h"
#include <QString>
#include <QStringList>
#include <QFileDialog>
#include <QFileInfo>
#include <QDebug>
#include <QRegExp>
#include <QList>
#include <QFile>
#include <QPushButton>
#include <QVBoxLayout>
#include <QProgressBar>
#include <QWidget>
#include <QThread>
QThredStudyMainWindow::QThredStudyMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::QThredStudyMainWindow)
{
    ui->setupUi(this);
    Start();
}

QThredStudyMainWindow::~QThredStudyMainWindow()
{
    delete ui;
}
void QThredStudyMainWindow::Start()
{
    qDebug() << "Main Thread : " << QThread::currentThreadId();

    // 创建开始按钮、进度条
    QPushButton *pStartButton = new QPushButton(this);

    //设置文本
    pStartButton->setText(QString::fromLocal8Bit("start"));

    QVBoxLayout *pLayout = new QVBoxLayout();
    pLayout->addWidget(pStartButton, 0, Qt::AlignHCenter);
    //pLayout->addWidget(m_pProgressBar);
    pLayout->setSpacing(50);
    pLayout->setContentsMargins(10, 10, 10, 10);
    QWidget *CenterWidget = new QWidget();
    this->setCentralWidget(CenterWidget);
    CenterWidget->setLayout(pLayout);
    //setLayout(pLayout);
    connect(pStartButton, SIGNAL(clicked(bool)), this, SLOT(slot_startThread()));
}

void QThredStudyMainWindow::slot_HandleResults(int value)
{
    //qDebug() << "Handle Thread : " << QThread::currentThreadId();
    m_pProgressBar->setValue(value);
    //qDebug() <<m_pProgressBar->maximum();
}

void QThredStudyMainWindow::slot_GetMaxVal(int Maxval)
{
    qDebug()<<"slot_GetMaxVal"<<Maxval;
    m_pProgressBar->setRange(0,Maxval);
}

void QThredStudyMainWindow::slot_startThread()
{
    //m_pProgressBar = new QProgressBar(this);
    m_pProgressBar = new QProgressBar();
    m_pProgressBar->setFixedHeight(25);
    //m_pProgressBar->setRange(0, 100);
    m_pProgressBar->setValue(0);

    //m_pProgressBar->show();
    //m_pProgressBar->setWindowFlags(Qt::Widget | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowStaysOnTopHint);
    //m_pProgressBar->raise();
    QString InitString ="D:/Ninja/NinjaResource/PointCloud/ScarletIOTestCloud";
    QString QStrIMGfileName = QFileDialog::getOpenFileName(
                0,"open any file",InitString);
    qDebug()<<QStrIMGfileName;
    m_workerThread = new WorkerThread(QStrIMGfileName,this);
    qDebug()<<"1";
    connect(m_workerThread, SIGNAL(resultReady(int)), this, SLOT(slot_HandleResults(int)));
    qDebug()<<"2";
    connect(m_workerThread, SIGNAL(finished()), m_workerThread, SLOT(deleteLater()));
    qDebug()<<"3";
    connect(m_workerThread, SIGNAL(finished()), this, SLOT(slot_thisFinished()));
    qDebug()<<"4";
    connect(m_workerThread, SIGNAL(signal_SetMaxVal(int)), this, SLOT(slot_GetMaxVal(int)));
    qDebug()<<"5";
    m_pProgressBar->showNormal();
    qDebug()<<"6";
    m_workerThread->start();
    qDebug()<<"7";
}

void QThredStudyMainWindow::slot_thisFinished()
{
    qDebug()<<"finish!";
    QList<QString> StrList = m_workerThread->ReturenQList();
    qDebug()<<StrList.size();
    qDebug()<<StrList[0];
    qDebug()<<StrList[StrList.size()-1];
    //m_pProgressBar->setVisible(false);
}


void QThredStudyMainWindow::do_ReadFile()
{
    m_myThred = new OhMyThred(this);
    connect(this,SIGNAL(signal_ReadLine(int)),m_myThred,SLOT(slot_SetVal(int)));
    QString InitString ="D:/Ninja/NinjaResource/PointCloud/ScarletIOTestCloud";
    QString QStrIMGfileName = QFileDialog::getOpenFileName(
                0,"open any file",InitString);
    qDebug()<<QStrIMGfileName;

    QFile file(QStrIMGfileName);
    if (!file.open(QFile::ReadOnly))
        return ; //we clear already initialized data
    //m_myThred-> SetMaximum();
    QTextStream stream(&file);
    QList<QString> StrList;
    int PtNum;
    QString currentLine;
    do
    {
        currentLine = stream.readLine();
        QStringList sections = currentLine.split(QRegExp("[ ]"));
        QString firstStr =sections[0].trimmed();
        if(firstStr == QString("ply"))
        {

        }
        else if(firstStr == QString("format"))
        {

        }
        else if(firstStr == QString("element"))
        {
            QString PtNumStr = sections[sections.size()-1];
            PtNum =PtNumStr.toDouble();
        }
    }while (!currentLine.isNull()&&
            currentLine!=QString("end_header"));
    m_myThred->SetMaximum(PtNum);
    m_myThred->start();
    do
    {
        currentLine = stream.readLine();
        QStringList sections = currentLine.split(QRegExp("[ ]"));
        StrList.push_back(currentLine);
        emit(signal_ReadLine(StrList.size()));
    }while(!currentLine.isNull());
}

void QThredStudyMainWindow::on_actionThredTest_triggered()
{
    do_ReadFile();
}

void QThredStudyMainWindow::on_action2_triggered()
{

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值