QT内存数据大,懒加载向有滚动条的文本写入数据
2021-09-08 本文已影响0人
c之气三段
这样可以避免界面卡死
m_everyRead 为每次插入行数
.h
#ifndef PREVIEWDIALOG_H
#define PREVIEWDIALOG_H
#include <QDialog>
#include <QLabel>
#include <QTextBrowser>
namespace Ui {
class PreviewDialog;
}
class PreviewDialog : public QDialog
{
Q_OBJECT
public:
explicit PreviewDialog(QWidget *parent = nullptr);
~PreviewDialog();
void setDate(const QVector<QString>&vec);
void showPreview();
void write();
void setFileName(const QString &fileName);
private:
Ui::PreviewDialog *ui;
QMovie *m_movie;
QVector<QString> m_vec;
int m_everyRead = 100;
int m_index = 0;
int m_endLine = 0;
int currSize= m_everyRead;
bool m_isWriting = false;
};
#endif // PREVIEWDIALOG_H
#include "PreviewDialog.h"
#include "ui_PreviewDialog.h"
#include<QDebug>
#include <QDesktopWidget>
#include <QMovie>
#include<qscrollbar.h>
PreviewDialog::PreviewDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::PreviewDialog)
{
ui->setupUi(this);
setWindowFlags(Qt::WindowCloseButtonHint|Qt::MSWindowsFixedSizeDialogHint);
m_movie = new QMovie(QStringLiteral(":/img/image/loading.png"),QByteArray(),this);
ui->label->setMovie(m_movie);
ui->label->setAlignment(Qt::AlignCenter);
m_movie->start();
this->show();
connect(ui->pushButton_cancel,&QPushButton::clicked,this,[=](){
close();
});
connect(ui->textBrowser->verticalScrollBar(),&QScrollBar::valueChanged,[=](int loc){
if(loc >= m_endLine-20&&(!m_isWriting))
{
write();
}
});
}
PreviewDialog::~PreviewDialog()
{
delete ui;
}
void PreviewDialog::setDate(const QVector<QString>&vec)
{
m_vec = vec;
write();
}
void PreviewDialog::showPreview()
{
m_movie->stop();
ui->stackedWidget->setCurrentIndex(1);
}
void PreviewDialog::write()
{
if(m_index>=m_vec.size())return;
m_isWriting = true;
m_endLine = ui->textBrowser->verticalScrollBar()->maximum();
for (int var = m_index; var < currSize; ++var)
{
if(var >= m_vec.size())return;
ui->textBrowser->append(m_vec.at(var));
}
ui->textBrowser->verticalScrollBar()->setValue(m_endLine);
m_index += m_everyRead;
currSize+=m_everyRead;
m_isWriting = false;
}
void PreviewDialog::setFileName(const QString& fileName)
{
ui->label_fileName->setText(fileName);
}