我们直接上干货,废话不多说。本文代码不会用的同学加我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;
}
#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()
{
}

3333

被折叠的 条评论
为什么被折叠?



