最近在学习QT开发,为了验证自己学习成果,最好还是做一个有点用的UI界面工具。想到了在前一家公司工作时,主要是分析出系统发生的异常,找出根本原因。这个异常可能发生在linux kernel,也可能是native 层的应用,也可能发生在apk中。特别是烧机和压力测试过程中发生的异常,通常会抓很多的log来辅助分析,这些log抓出来后会是一个好几G的大文件,利用文本工具打开来查看log,几G的文件基本打不开,就算可以打开,在里面搜索关键字也很慢,而且经常会卡死。所以就需要一个工具来把这几G的大文件分割成几个小一点的文件。从网上下载的一个工具,使用起来很麻烦,估计是在XP时代开发的,选择文件或者目录的时候,弹出来的是树状的文件结构,要不断展开,很不友好。所以我自己利用QT做了这样一个工具

上面就是工具的界面,如果觉得不好看,可以下载源码自行修改

源码下载:https://download.csdn.net/download/xiongtiancheng/10424328

安装包下载:https://download.csdn.net/download/xiongtiancheng/10424352

安装包我是用Setup Factory 9 工具来打包的。

实现还算是比较简单了,主要是要理解QT中的布局管理,这样才能把组件放到理想的位置,显示合理的大小。下面是我认为一下值得分享的几个点,对刚接触QT的同学比较有用

1、添加图片资源

我们需要自定义按钮的样式,为了让按钮显示得好看些,需要使用到png图片

在工程中点击右键,选择添加新文件,在弹出的新建文件窗口中选择Qt Resource File,然后点击选择

在弹出的窗口中输入文件名,然后点击下一步,继续点击完成即可。

然后会出现如上界面,点击添加下拉选择按钮,选择“添加前缀”

然后随便输入一个前缀,比如/res ,然后继续点击添加下拉选择按钮,选择 “添加文件”

在弹出的文件选择窗口中,选择要添加的png图片文件,或者其他文件,最后记得保存一下

引用对应的图片时,路径写成 :/res/xxx    例如

":/res/res/images/split_icon.png"

2、修改按钮样式

   QPushButton *btn_min = new QPushButton(centralWidget);btn_min->setFixedSize(40,30); //设置按钮大小btn_min->setFlat(true);    btn_min->setStyleSheet("QPushButton{background-image: url(:/res/res/images/min_normal.png);}""QPushButton:hover{background-image: url(:/res/res/images/min_on.png);}""QPushButton:pressed{background-image: url(:/res/res/images/min_press.png);}");

调用setStyleSheet() 就可以了,setFlat() 用来设置按钮扁平,不然看起来还是会凸起。

3、实现窗口移动

void MainWindow::mousePressEvent(QMouseEvent* e){  // 鼠标单击事件if(e->button()==Qt::LeftButton){mPressPos=e->pos();mPressed=true;}
}
void MainWindow::mouseMoveEvent(QMouseEvent* e){    // 鼠标移动事件if(mPressed){move(e->globalPos()-mPressPos);}
}
void MainWindow::mouseReleaseEvent(QMouseEvent* e){  // 鼠标释放事件mPressed=false;
}

这个很简单,重写mousePressEvent() , mouseMoveEvent() , mouseReleaseEvent() 这三个函数就可以了。

在mouseMoveEvent() 中调用move() 函数将窗口移动到需要的位置即可,move()中的参数是窗口的起始坐标(左上角),所以我们需要在按下时记录按下的点到窗口的起始点的位置mPressPos,e->globalPos()是相对于window桌面起始点的位置。e->globalPos()-mPressPos 正好得到窗口需要移动到的位置,这个位置是相对于桌面起始点的位置。

4、两个线程间传递消息

分割大文件无非是读取大文件的数据,然后写到几个小文件中,如果把读写文件的操作放在一个线程里面做,那么界面的更新就会卡住,鼠标移动到窗口上时会显示转圈圈,甚至会出现不响应的情况。所以我们需要把读写文件的操作放到另外一个线程中去做,当前的线程就负责更新界面显示。 那么读写文件的线程需要把更新界面的消息给到当前线程应该怎么实现呢?

 signals:void signalUpdate(int value);void signalAppend(const QString& appendText);

首先在读写文件的工作线程中定义signals 对应的函数,函数中的参数就是传给当前线程的参数。

protected slots:void onHandleUpdate(int value);void onHandleAppend(const QString& appendText);

在当前线程中定义 slots 对应的函数,函数的参数和signals 是对应的。

WorkerThread *workerThread = new WorkerThread(this);workerThread->setWorkerParams(filePath,dirPath,splitSize);connect(workerThread, SIGNAL(signalUpdate(int)), this, SLOT(onHandleUpdate(int)));connect(workerThread, SIGNAL(signalAppend(const QString&)), this, SLOT(onHandleAppend(const QString&)));// 线程结束后,自动销毁connect(workerThread, SIGNAL(finished()), workerThread, SLOT(deleteLater()));workerThread->start();

slots 和 signals 函数的绑定也是通过connect()来完成,和给按钮绑定点击事件类似。

signalUpdate(0);   //按钮无法点击

读写文件工作线程发送消息,调用signalUpdate() 实现。

void MainWindow::onHandleUpdate(int value){mProgressBar->setValue(value);if(value==0){mBtnStart->setEnabled(false);  //按钮无法点击}else if(value==100){mBtnStart->setEnabled(true); //按钮恢复可以点击}
}

当前的线程会收到消息,并回调onHandleUpdate() 函数处理。

这样的通信模型都很类似,无非是读写文件工作线程调用signalUpdate()后,会把要发送的消息打包成某种消息格式,然后放到当前线程的消息队列中,当前线程从消息队列中取出消息,解析消息,交给对应的处理函数处理。

大文件分割工具,QT实现相关推荐

  1. c语言 拆分 文件,linux 将一个大文件分割成小的碎片文件 命令:csplit

    csplit命令用于将一个大文件分割成小的碎片,并且将分割后的每个碎片保存成一个文件.碎片文件的命名类似"xx00","xx01".csplit命令是split ...

  2. PHP上传大文件 分割文件上传

    PHP上传大文件 分割文件上传 PHP上传大文件 分割文件上传 作者:Eamonn 发布时间:2012-03-24 14:49 访问:523 分类:PHP & Mysql 最近遇到这么个情况, ...

  3. android 大图 分块,android 大文件分割上传(分块上传)

    由于android自身的原因,对大文件(如视频文件)的操作很容易造成OOM,即:Dalvik堆内存溢出,利用文件分割将大文件分割为小文件可以解决问题. 文件分割后分多次请求服务. //文件分割上传 p ...

  4. 4种大文件传输工具和软件,用于共享大文件

    无论是个人还是与团队一起工作,大文件传输软件和网站都能协助提高工作效率.有效地管理工作内容.疫情原因有时我们不得不居家办公,在这种情况下可以分享文件的工具就显得尤为重要. 每个公司都需要一个文件传输软 ...

  5. 这些大文件传输工具总结,建议外贸人士收藏

    各位外贸小伙伴一定遇到过这类大文件传输难题,在成单前,不可避免的需要为客户发送产品设计稿.产品分类和其他信息明细,这些线上文件如果运用得当,很大几率能更快的促成交易,因此小到五或六个GB的文件,大到上 ...

  6. linux大文件分割 split命令

    原文地址为: linux大文件分割 split命令 inux split 命令 功能说明:切割文件. 语 法:split [--help][--version][-<行数>][-b < ...

  7. android培训之android下大文件分割上传(摘自达内总部)

    由于android自身的原因,对大文件(如影视频文件)的*作很容易造成OOM,即:Dalvik堆内存溢出,利用文件分割将大文件分割为小文件可以解决问题. 文件分割后分多次请求服务.  1 //文件分割 ...

  8. windows 打开大文件 日志 工具

    windows 打开大文件 日志 工具 通常使用txt工具或nodepad++ 打开1G以上的日志上的文件会卡死或者报错.找到一个强大的工具 - EmEdit  亲测0秒打7G的日志文件,可进行编辑! ...

  9. 如何高速拷贝超大文件?大文件拷贝工具Total Copy和Burst Copy

    文件越来越大,硬盘空间也越来越大,但在拷贝和移动大文件时,你是否曾遇到过麻烦?是速度太慢?是经常出现操作失败?还是在操作期间消耗过多的系统资源使系统处于停滞状态?不必担心,仔细阅读本文后,以上种种问题 ...

  10. Java:将大文件拆分工具

    java大文件拆分工具(过滤掉表头) import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File ...

最新文章

  1. 通过facade(尤其是realtime facade)来使代码更优雅
  2. Go语言重点知识点1
  3. LeetCode Hot100 ---- 滑动窗口专题
  4. 我喜欢构建器模式的三个原因
  5. amap不同样式marker点_想出一手漂亮的图,CAD打印样式表你必须会!
  6. webpack+react+redux+es6开发模式---续
  7. 性能测试的几个参数概念
  8. 实时音频编程(二):实践与技巧
  9. typescript parseint不能传number_Typescript 使用日志
  10. Oracle数据库关闭的三种方法
  11. CrazyWing:Python自动化运维开发实战 十八、Python面向对象
  12. TensorFlow 的简化接口Scikit Flow
  13. 24.docker port
  14. 利用PowerShell复制SQLServer账户的所有权限
  15. tornado异步请求的理解
  16. CSDN账号 账号设置
  17. textfind:文本分析之词频分析-TF-IDF
  18. 利用虚拟机virtualbox配置智汀家庭云,让米家设备连接Homekit
  19. windows XP无法使用suspend to RAM (s3)功能的解决过程
  20. 移动互联网-----概述

热门文章

  1. 2022/7/14小记
  2. Mobile - 小米手机如何开通应用分身?应用多开?
  3. 违背妇女意志_2018年国际妇女节:在技术中庆祝妇女
  4. rocketmq源码③-Producer的启动、发送消息、路由broker
  5. 帝国站长php主动推送,帝国CMS 链接主动推送插件设置帮助
  6. 根据经纬度查询地理位置API
  7. 软件测试用例设计时的颗粒度
  8. Prettier your project
  9. python span()函数_Python正则表达式六种函数实例讲解
  10. 东南大学计算机系分数,2017最新东南大学专业排名及分数线