my-QT专栏

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);
}
上一篇 下一篇

猜你喜欢

热点阅读