美文网首页my-QT专栏
QT内存数据大,懒加载向有滚动条的文本写入数据

QT内存数据大,懒加载向有滚动条的文本写入数据

作者: c之气三段 | 来源:发表于2021-09-08 15:00 被阅读0次

这样可以避免界面卡死
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);
}

相关文章

  • QT内存数据大,懒加载向有滚动条的文本写入数据

    这样可以避免界面卡死m_everyRead 为每次插入行数.h

  • MySQL---数据库从入门走向大神系列(九)-用Java向数据

    介绍MySQL的文本和图形数据类型: Text 类型: 用Java向数据写入读取大文本数据: 准备: 查询表结构:...

  • SAP验证长文本是否输入

    SAP长文本在写入数据库前,会将长文本数据存入到ABAP内存中,当结束屏幕程序后,调用 create_text 将...

  • Elasticsearch入门(三)—— 提高查询效率

    数据写入过程 数据写入到内存buffer 同时写入到数据到translog buffer,这是为了防止数据不会丢失...

  • 2018-08-20

    大数据处理、特征工程、模型选择 1.小内存电脑如何处理大数据 数据加载 对于非常大的数据,直接全部加载到内存是不可...

  • Qt 数据存储(一)

    数据存储 保存和加载数据[https://doc.qt.io/qt-5.15/topics-data-storag...

  • JMM内存模型

    1.八大原子命令read 读取。主内存读取数据load 载入。将主内存读取到的数据写入工作内存use 使用。 ...

  • redis内存淘汰策略

    当内存不够时写入数据的策略 noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。 allkeys...

  • 无标题文章

    大并发写入案例: 高并发,大数据量写入:先把数据写入到内存,积累到一定的量后,在定时或者定量的写入到磁盘(减少磁盘...

  • 懒加载

    苹果推荐使用懒加载 节省内存资源,当需要时再去请求数据优点:1.只有当引用时,才会触发加载数据的方法2.加载方法只...

网友评论

    本文标题:QT内存数据大,懒加载向有滚动条的文本写入数据

    本文链接:https://www.haomeiwen.com/subject/ysyvwltx.html