• 10742阅读
  • 11回复

[讨论]qt读取.bin文件,显示在textEdit上,显示速度特别慢 [复制链接]

上一主题 下一主题
离线ayumi.
 

只看楼主 倒序阅读 楼主  发表于: 2017-09-19
最近需要写一个小工具,读.bin文件(文件大小200k),16进制显示,然后分包发送出去。
程序在执行ui->textEdit->insertPlainText (*tempStr);会等一会才显示。
点击我下载源码
下面是打开文件并显示槽函数:
  1. void MainWindow::on_openFileButton_clicked()
  2. {
  3.     //get file name
  4.     fileName = QFileDialog::getOpenFileName(this,"Open File",QDir::currentPath());
  5. //    qDebug()<< "fileName is" << fileName;
  6.     ui->filePathLineEdit->setText (fileName);
  7.     if(fileName.isEmpty())
  8.     {
  9.         QMessageBox::information(this,"Error Message", "Please Select a Text File");
  10.         return;
  11.     }
  12.     QFileInfo *pcsfileInfo = new QFileInfo(fileName);
  13.     binSize = pcsfileInfo->size ();
  14.     QFile* file = new QFile;
  15.     file->setFileName(fileName);
  16.     bool ok = file->open(QIODevice::ReadOnly);
  17.     if(ok)
  18.     {
  19. //        QTextStream in(file);
  20. //        ui->textEdit->setText(in.readAll());//read all context from the file
  21.     }
  22.     else
  23.     {
  24.         QMessageBox::information(this,"Error Message", "File Open Error" + file->errorString());
  25.         return;
  26.     }
  27.     QDataStream in(file);
  28.     char * binByte = new char[binSize];
  29.     in.setVersion (QDataStream::Qt_5_9);
  30.     ui->statusBar->showMessage(tr("准备读取数据"));
  31.     in.readRawData (binByte, binSize);      //读出文件到缓存
  32.     ui->statusBar->showMessage(tr("读取数据完毕"));
  33.     tempByte = new QByteArray(binByte, binSize);                //格式转换
  34.     delete[] binByte;
  35.     QString *tempStr = new QString(tempByte->toHex ().toUpper ());
  36. //    ui->textEdit->append(*tempStr);
  37. //    int i;
  38. //    for(i = 0; i < tempStr->size (); i++)
  39. //    {
  40. //        if(i%64 == 0)
  41. //        {
  42. //        QString str1 = tempStr->mid(i,i+64);
  43. //        qDebug("i:%d i+64:%d",i,i+64);
  44. //        ui->textEdit->append(str1);
  45. //        }
  46. //    }
  47.     //显示文件内容
  48.     qint8 cnt = 1;
  49.     qint16 kcnt = 0;
  50.     for(qint64 i = 2; i < tempStr->size ();)
  51.     {
  52.         tempStr->insert (i, ' ');//每个字节之间空一格
  53.         i += 3;
  54.         cnt++;
  55.         if(cnt == 8)//每8个字节空2格
  56.         {
  57.             tempStr->insert (i, ' ');
  58.             i += 1;
  59.         }
  60.         if(cnt == 16)//每16个字节空一格
  61.         {
  62.             cnt = 1;
  63.             kcnt ++;
  64.             if(kcnt == 64)//每64行,即1K数据,空一行
  65.             {
  66.                 kcnt = 0;
  67.                 tempStr->insert (i, '\n');
  68.                 i++;
  69.             }
  70.             tempStr->insert (i, '\n');
  71.             i += 3;         //避免换行后开头一个空格,换行相当于从新插入
  72.         }
  73.     }
  74.     ui->statusBar->showMessage(tr("准备显示"));
  75.     ui->textEdit->insertPlainText (*tempStr);//这句话执行非常慢
  76.     ui->statusBar->showMessage(tr("显示完毕"));
  77.     timer->start(10);
  78.     delete tempStr;
  79.     file->close ();
  80.     delete file;



离线lemonzll

只看该作者 1楼 发表于: 2017-09-19
qtextedit速度是很慢,功能要求比较少的话可以用qplaintextedit,速度会稍微快点。以前做过软件接收到网络消息时进行显示,用qtextedit很卡,行数多了没法用,只好限制最大行数,并且换用qplaintextedit稍微优化点,要实在性能不行可以看下scintilla这个编辑器控件,qt可以用的,不过功能要求少的话用scintilla就得不偿失了
4条评分好评度+1贡献值+1金钱+1威望+1
ayumi. 好评度 +1 优秀文章,支持!n神马都是浮云 2017-09-20
ayumi. 贡献值 +1 优秀文章,支持!n神马都是浮云 2017-09-20
ayumi. 威望 +1 优秀文章,支持!n神马都是浮云 2017-09-20
ayumi. 金钱 +1 优秀文章,支持!n神马都是浮云 2017-09-20
离线ayumi.

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

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

只看该作者 3楼 发表于: 2017-09-20
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。要是不需要三态就好写很多了
4条评分好评度+1贡献值+1金钱+1威望+1
ayumi. 好评度 +1 - 2017-09-20
ayumi. 贡献值 +1 - 2017-09-20
ayumi. 威望 +1 - 2017-09-20
ayumi. 金钱 +1 - 2017-09-20
离线ayumi.

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

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

只看该作者 5楼 发表于: 2017-09-20
你看需不需要编辑功能,不需要编辑功能的话直接用qlabel显示字符串就行
4条评分好评度+1贡献值+1金钱+1威望+1
ayumi. 好评度 +1 - 2017-09-20
ayumi. 贡献值 +1 - 2017-09-20
ayumi. 威望 +1 - 2017-09-20
ayumi. 金钱 +1 - 2017-09-20
离线ayumi.

只看该作者 6楼 发表于: 2017-09-20
回 lemonzll 的帖子
lemonzll:你看需不需要编辑功能,不需要编辑功能的话直接用qlabel显示字符串就行 (2017-09-20 09:46) 

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

只看该作者 7楼 发表于: 2017-09-20
QtCreator的底部编译输出就是QPlainTextEdit 性能应该足够
4条评分好评度+1贡献值+1金钱+1威望+1
ayumi. 好评度 +1 - 2018-01-04
ayumi. 贡献值 +1 - 2018-01-04
ayumi. 威望 +1 - 2018-01-04
ayumi. 金钱 +1 - 2018-01-04
QtQML多多指教开发社区 http://qtclub.heilqt.com
将QtCoding进行到底
关注移动互联网,关注金融
开发跨平台客户端,服务于金融行业
专业定制界面
群号:312125701   373955953(qml控件定做)
离线九重水

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

只看该作者 9楼 发表于: 2017-09-26
我写了个文档25页,也不过是150K多一点点。
离线九重水

只看该作者 10楼 发表于: 2017-09-26
我推荐一种显示刷新方式,你先大致估计一下,一页(1920*1080)需要多少个字符。
显示的时候,每次只刷一页上去(初次显示也是这样)。反正屏幕就这么大,你显示了也看不到,还浪费CPU。
用户去扯那个滚动条的时候再显示其他的。相信任何一个编辑器都是这样干的。
4条评分好评度+1贡献值+1金钱+1威望+1
ayumi. 好评度 +1 优秀文章,支持!n神马都是浮云 2018-01-04
ayumi. 贡献值 +1 优秀文章,支持!n神马都是浮云 2018-01-04
ayumi. 威望 +1 优秀文章,支持!n神马都是浮云 2018-01-04
ayumi. 金钱 +1 优秀文章,支持!n神马都是浮云 2018-01-04
离线dosmlp

只看该作者 11楼 发表于: 2017-09-26
这种表格实现,建议使用qt的model/view
4条评分好评度+1贡献值+1金钱+1威望+1
ayumi. 好评度 +1 - 2018-01-04
ayumi. 贡献值 +1 - 2018-01-04
ayumi. 威望 +1 - 2018-01-04
ayumi. 金钱 +1 - 2018-01-04
快速回复
限100 字节
 
上一个 下一个