找回密码
 立即注册
Qt开源社区 门户 查看内容

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

2019-8-11 07:06| 发布者: admin| 查看: 1269| 评论: 0

摘要: spreadsheet是一个简单的电子表格程序,相当于简化版的excel,日常用用还不错,用自己写的工具还挺过瘾的。※ v0.05版本需求:完善状态栏:- 显示单元格坐标及内容;完善Edit菜单:- 实现复制粘贴;一、完善状态栏 ...
spreadsheet是一个简单的电子表格程序,相当于简化版的excel,日常用用还不错,用自己写的工具还挺过瘾的。

※ v0.05版本需求:
完善状态栏:- 显示单元格坐标及内容;
完善Edit菜单:
- 实现复制粘贴;



一、完善状态栏:

※ 显示单元格坐标及内容;

Spreadsheet的状态栏会显示3类信息:
1. 当工具栏里某个功能被hover时,显示该功能的提示信息,如“Create a new spreadsheet file”;2. 当某个操作执行成功时,显示临时信息,如“File saved”3. 当某个单元格被选中时,显示“单元格坐标 单元格内容”;
如何实现第3类信息的显示?
- 在MainWindow中添加成员: QLabel *locationLabel; QLabel *formulaLabel;locationLabel用于显示单元格坐标,formulaLabel用于显示单元格内容,这里起名formula是因为后续我们会在单元格上支持运算公式的功能;
- 有2种情况要在状态栏上更新单元格状态信息:1. 单元格的内容被修改时(itermChanged);2. 改变选中的单元格时(currentCellChanged);
修改createStatusBar():



- statusBar()类似menuBar(),第一次调用时会为主窗口创建QStatusBar对象,再次调用则直接返回前面已经创建过的对象;- spreadsheetModified()中也会调用updateStatusBar(),刚好对应上面的2种需要更新单元格状态信息的情况,updateStatusBar()的定义如下:


currentLocation()和currentFormula()都是Spreadsheet的成员函数:



- currentColumn()和currentRow()都是从父类QTableWidget继承而来的成员函数;- QTableWidgetItem::item()函数会返回指定单元格的QTableWidgetItem对象,再次强调:单元格的QTableWidgetItem对象并不一定存在。当用户在空的单元格中输入内容时,QTableWidget才会自动创建一个QTableWidgetItem来保存这些内容,对于一个完全没有被改动过的单元格,item()函数就会返回空;- 由于许多操作(例如File->Save,Edit->copy等)都需要获取单元格的内容,我们将获取单元格的内容的操作封装成formula()函数;
运行效果:



二、完善Edit菜单

※ 实现复制
复制粘贴有点像前面实现过的保存打开文件,本质上复制就是将选中的单元格内容以字符串的形式保存到系统粘贴板中,粘贴则是将系统粘贴板里的文本信息写到目标单元格上。
只允许选中一个或者一片连续的单元格:
setSelectionMode(ContiguousSelection);
默认的模式是ExtendedSelection:Ctrl+左键可选中不连续的多个区域,Shift+左键可选中一片连续的区域。而ContiguousSelection模式表示Ctrl+左键和Shift+左键都是选中一片连续的区域,不允许选择多片区域。为了简化代码,我们只实现复制粘贴连续单元格的功能,所以设置为ContiguousSelection。
在MainWindow的构造函数中绑定相关的信号槽:



实现copy():



- QTableWidgetSelectionRange类用于描述一片选中的区域;- 由于使用了ContiguousSelection模式,所以Spreasheet里永远只有一片选中的区域;- 有多个功能(File->Copy、File->Paste、Tools->Sort)需要获取当前选中区域,所以我们将获取当前选中区域封装成函数SpreadSheet::selectedRange():    

* selectedRanges()是QTableWidget的成员函数,它会返回所有的选中区域(一片或者多片),由于Spreadsheet永远只有一片选中的区域,所以返回第一片区域即可。
- 需要被复制的单元格内容会用QString以类似 "ABC\t\n\t123" 的形式保存,\t表示列间隔,\n表示行间隔,"ABC\t\n\t123" 等效于:
   


* 微软的Excel也是采用同样的形式。- 静态函数QApplication::clipboard()会返回一个表示系统剪贴板的QClipboard对象;

※ 实现粘贴
paste的本质就是解析系统剪贴板上的文本信息,然后填写目标区域的单元格。
实现paste():



- 使用静态函数QString::split()来切割剪贴板上的文本信息( "ABC\t\n\t123" );- QStringList可用于存储多个字符串,切割后rows=("ABC\t", "\t123"),numRows=2,numColumns=2;
只有2种情况允许执行粘贴操作:



1. 目标单元格区域只有1个单元格时;2. 目标单元格区域的行列数和源单元格区域一致时;
设置目标单元格:



Spreadsheet::formula()返回单元格内容,Spreadsheet::setFormula()则用于设置单元格内容。
运行效果:



到此,spreadsheet-v0.05开发完毕,参考书籍:《C++ GUI Qt4 编程》

从今天开始,我决定减肥,当前身高体重为176cm/73KG。先定个小目标:戒掉奶茶。。。。



你和我各有一个苹果,如果我们交换苹果的话,我们还是只有一个苹果。但当你和我各有一个想法,我们交换想法的话,我们就都有两个想法了。如果你也对嵌入式系统开发有兴趣,并且想和更多人互相交流学习的话,请关注我的公众号:ESexpert,一起来学习吧,欢迎各种收藏/转发/批评。

----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:嵌入式系统砖家,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了