查看完整版本: [-- qt读取.bin文件,显示在textEdit上,显示速度特别慢 --]

QTCN开发网 -> Qt基础编程 -> qt读取.bin文件,显示在textEdit上,显示速度特别慢 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

ayumi. 2017-09-19 16:54

qt读取.bin文件,显示在textEdit上,显示速度特别慢

最近需要写一个小工具,读.bin文件(文件大小200k),16进制显示,然后分包发送出去。
程序在执行ui->textEdit->insertPlainText (*tempStr);会等一会才显示。
点击我下载源码
下面是打开文件并显示槽函数:
  1. void MainWindow::on_openFileButton_clicked()
    {
        //get file name
        fileName = QFileDialog::getOpenFileName(this,"Open File",QDir::currentPath());
    //    qDebug()<< "fileName is" << fileName;
        ui->filePathLineEdit->setText (fileName);
        if(fileName.isEmpty())
        {
            QMessageBox::information(this,"Error Message", "Please Select a Text File");
            return;
        }
        QFileInfo *pcsfileInfo = new QFileInfo(fileName);
        binSize = pcsfileInfo->size ();

        QFile* file = new QFile;
        file->setFileName(fileName);
        bool ok = file->open(QIODevice::ReadOnly);
        if(ok)
        {
    //        QTextStream in(file);
    //        ui->textEdit->setText(in.readAll());//read all context from the file
        }
        else
        {
            QMessageBox::information(this,"Error Message", "File Open Error" + file->errorString());
            return;
        }
        QDataStream in(file);
        char * binByte = new char[binSize];
        in.setVersion (QDataStream::Qt_5_9);

        ui->statusBar->showMessage(tr("准备读取数据"));
        in.readRawData (binByte, binSize);      //读出文件到缓存
        ui->statusBar->showMessage(tr("读取数据完毕"));

        tempByte = new QByteArray(binByte, binSize);                //格式转换
        delete[] binByte;
        QString *tempStr = new QString(tempByte->toHex ().toUpper ());
    //    ui->textEdit->append(*tempStr);
    //    int i;
    //    for(i = 0; i < tempStr->size (); i++)
    //    {
    //        if(i%64 == 0)
    //        {
    //        QString str1 = tempStr->mid(i,i+64);
    //        qDebug("i:%d i+64:%d",i,i+64);
    //        ui->textEdit->append(str1);
    //        }
    //    }
        //显示文件内容
        qint8 cnt = 1;
        qint16 kcnt = 0;
        for(qint64 i = 2; i < tempStr->size ();)
        {
            tempStr->insert (i, ' ');//每个字节之间空一格
            i += 3;
            cnt++;
            if(cnt == 8)//每8个字节空2格
            {
                tempStr->insert (i, ' ');
                i += 1;
            }
            if(cnt == 16)//每16个字节空一格
            {
                cnt = 1;
                kcnt ++;
                if(kcnt == 64)//每64行,即1K数据,空一行
                {
                    kcnt = 0;
                    tempStr->insert (i, '\n');
                    i++;
                }
                tempStr->insert (i, '\n');
                i += 3;         //避免换行后开头一个空格,换行相当于从新插入
            }

        }
        ui->statusBar->showMessage(tr("准备显示"));
        ui->textEdit->insertPlainText (*tempStr);//这句话执行非常慢
        ui->statusBar->showMessage(tr("显示完毕"));

        timer->start(10);

        delete tempStr;

        file->close ();
        delete file;




lemonzll 2017-09-19 22:08
qtextedit速度是很慢,功能要求比较少的话可以用qplaintextedit,速度会稍微快点。以前做过软件接收到网络消息时进行显示,用qtextedit很卡,行数多了没法用,只好限制最大行数,并且换用qplaintextedit稍微优化点,要实在性能不行可以看下scintilla这个编辑器控件,qt可以用的,不过功能要求少的话用scintilla就得不偿失了

ayumi. 2017-09-20 09:07
lemonzll:qtextedit速度是很慢,功能要求比较少的话可以用qplaintextedit,速度会稍微快点。以前做过软件接收到网络消息时进行显示,用qtextedit很卡,行数多了没法用,只好限制最大行数,并且换用qplaintextedit稍微优化点,要实在性能不行可以看下scintilla这个编辑器控件,qt可以用的, .. (2017-09-19 22:08) 

我调试的时候认为是200k的Qstring太长了,就想用for循环把Qstring拷贝到一个比较小的Qstring中,在for循环中使用append方法,这样可能会好一些,但是我发现,for循环执行完毕后,才开始在textEdit上显示。
请问除了您说的,sdintilla这个控件还有没有其它的方法?
我想做到下面图片的效果,文件被分成固定长度字符串显示在表格里。
还有就是,左面的那种树形结构,前面可以勾选,qt的树形结构好像没有这个。这个是不是可以设置?
[attachment=17927]

lemonzll 2017-09-20 09:32
200K的QString已经很大了。文本显示你看你需不需要编辑,要有编辑功能的话就QTextEdit和QPlainTextEdit这两个,性能不够的话暂时除了scintilla我也没找到好方法。不需要编辑功能的话好办点,用qlabel或者自己用qwidget画。树形结构群里很多,你可以查下。你那里图里面显示还有三态的,我找了两个可参考的,http://www.qtcn.org/bbs/read-htm-tid-57249.htmlhttp://www.qtcn.org/bbs/read-htm-tid-55887-ds-1.html#tpc。要是不需要三态就好写很多了

ayumi. 2017-09-20 09:36
lemonzll:200K的QString已经很大了。文本显示你看你需不需要编辑,要有编辑功能的话就QTextEdit和QPlainTextEdit这两个,性能不够的话暂时除了scintilla我也没找到好方法。不需要编辑功能的话好办点,用qlabel或者自己用qwidget画。树形结构群里很多,你可以查下。你那里图里面显示还有三态 .. (2017-09-20 09:32) 

谢谢~~原来那个叫做三态树。。。原谅我是个小白,见笑了。
qlabel,qwidget自己画是自己画出一个textedit来吗?

lemonzll 2017-09-20 09:46
你看需不需要编辑功能,不需要编辑功能的话直接用qlabel显示字符串就行

ayumi. 2017-09-20 09:48
lemonzll:你看需不需要编辑功能,不需要编辑功能的话直接用qlabel显示字符串就行 (2017-09-20 09:46) 

谢谢,我不用编辑。。。我先用qlabel试一试

toby520 2017-09-20 09:58
QtCreator的底部编译输出就是QPlainTextEdit 性能应该足够

九重水 2017-09-26 09:19
200K是很大的数据,一个1920X1080的屏幕都显示不下(五号字,wps word,PS:WPS也是QT做的)。
你确定要200K直接刷在屏幕上?不是一页一页刷出来?每次只显示一页,什么控件性能都够了吧。

九重水 2017-09-26 09:20
我写了个文档25页,也不过是150K多一点点。

九重水 2017-09-26 09:35
我推荐一种显示刷新方式,你先大致估计一下,一页(1920*1080)需要多少个字符。
显示的时候,每次只刷一页上去(初次显示也是这样)。反正屏幕就这么大,你显示了也看不到,还浪费CPU。
用户去扯那个滚动条的时候再显示其他的。相信任何一个编辑器都是这样干的。

dosmlp 2017-09-26 17:42
这种表格实现,建议使用qt的model/view


查看完整版本: [-- qt读取.bin文件,显示在textEdit上,显示速度特别慢 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled