专业的编程技术博客社区

网站首页 > 博客文章 正文

Qt入门_开发电子表格_spreadsheet-v0.02

baijin 2024-10-24 08:43:27 博客文章 6 ℃ 0 评论

spreadsheet是一个简单的电子表格程序,相当于简化版的excel,日常用用还不错,用自己写的工具还挺过瘾的。


v-0.02版本的需求:

- 完善中央窗口;
- 实现保存文件;



一、完善中央窗口

前面我们是用QTableWidget作为中央窗口,QTableWidget虽然提供了不少电子表格的功能,但是没有剪贴板、数学公式等功能,为了后续方便实现一些自定义的功能,我们需要定义一个QTableWidget的子类:SpreadSheet。同时,我们也应该将一些底层的操作封装在SpreadSheet里,供MainWindow调用,这样程序比较有层次感。


※ SpreadSheet里要做什么?

随便想想:
- 所有仅和中央窗口相关的功能都应该在SpreadSheet里实现;
- 初始化表格的外观,例如设置行列标题等;
- 实现底层的文件保存(writeFile())和载入(readFile())功能,供MainWindow调用;
- 实现表格的复制粘贴删除(cut()/copy()/...);
- 实现表格的排序功能(sort());
- 实现查找功能(findNext());
- 实现数学公式(formula());
- 定义表格被修改时的信号(modified())和槽(somethingChanged()),用于管理表格自身的状态;

目前就想到这么多,剩下的边做边想就好了,没必要过度设计。


※ 添加SpreadSheet类

在MainWindow的构造函数中改用SpreadSheet对象:

spreadsheet = new SpreadSheet;


※ 初始化表格的外观
在SpreadSheet里定义一个clear(),负责清空表格,将表格恢复成初始化的状态:

- 创建SpreadSheet对象时和打开文件时会执行clear();
- RowCount=999,ColumnCount=26(即A~Z),所以第一个单元格为A1,最后一个单元格为Z999;
- SpreadSheet继承于QTableWidget,QTableWidget里的setRowCount()/setColumnCount()/setCurrentCell()被继承下来了,可直接调用;
- QTableWidgetItem用于表格一个单元格,当用户在空单元格输入文本时,QTableWidget会自动创建一个QTableWidgetItem;
- setHorizontalHeaderItem()会为指定的列设置表头;

运行效果:



二、实现File菜单

※ 如何保存文件(Save和SaveAs功能)?

1> 只有先实现了保存文件的功能,才能接着实现载入文件的功能;
2> 第一次保存文件(MainWindow::save)时,先要让用户选择保存的路径(MainWindow::saveAs),保存过一次后要记录下当前文件(curFile)的完整路径,然后再写数据到文件里(MainWindow::saveFile)。再次执行save时,则直接将数据写到文件(curFile)里(saveFile):
    * 在MainWindow::createActions()中绑定saveAction的triggered()信号和槽save():


    * save()的定义如下,先判断是否有了目标路径,有的话直接保存,没有的话弹出对话框:


    *  saveAs()负责弹出对话框供用户选择目标路径:
        - "Save Spreadsheet" 是对话框标题;
        -  "." 表示从当前目录开始;
        - "Spreadsheet files (*.sp)" 是文件过滤器,前半段是注释,括号内的是通配符;

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。

点击这里找小助理0元领取:加微信领取资料




 * saveFile()会调用SpreadSheet::writeFile,并且更新状态栏:

3> 当用户在空单元格输入文本时,QTableWidget会自动创建一个QTableWidgetItem,即数据是保存在QTableWidgetItem对象里的。写数据到文件(SpreadSheet::writeFile)本质就是将SpreadSheet里非空单元格里的数据以自己定义的格式写到文件里。SpreadSheet::writeFile的实现如下:
    * QFile用于描述一个文件,它负责文件的打开和关闭;


* QDataStream用于描述二进制数据流,它定义了二进制数据的存储方式,例如整型的字节序、字符串的编码格式等。不同版本的Qt的二进制数据存储方式可能会不一样,为了避免兼容性,程序里要明确地设置QDataStream的版本();

    * C++的基本类型在不同平台上可能会有不同的位宽,用quint32()强制转换可以确保位宽固定为32bit;


* MagicNumber是用来标识SpreadSheet文件的;

    * setOverrideCursor()用于将鼠标的状态设置为等待状态,通常就是一个漏斗;
    * SpreadSheet文件的数据格式为:行+列+单元格字符串;
    * 不需要手动关闭文件,函数结束时QFile会被析构,QFile的析构函数会关闭文件;

运行效果:



检查数据的正确性:


到此,0.02版本的spreadsheet开发完毕,参考书籍:

《C++ GUI Qt4 编程》


文章链接:
https://mp.weixin.qq.com/s/p2-ha6DHTxdlG8Dn_tqEng

转载自:老吴嵌入式,作者吴伟东Jack

文章链接:Qt入门_开发电子表格_spreadsheet-v0.02

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表