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

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

2019-9-20 09:51| 发布者: admin| 查看: 656| 评论: 0

摘要: 好久没更新Qt相关的文章了,今天再次重启Qt探索计划。都是些简单的功能,每天都摸一摸,练练手,快乐似神仙。spreadsheet是一个简单的电子表格程序,相当于简化版的excel,日常用用还不错,用自己写的工具还挺过瘾的 ...
好久没更新Qt相关的文章了,今天再次重启Qt探索计划。都是些简单的功能,每天都摸一摸,练练手,快乐似神仙。

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

※ 0.06版本需求:
完善Edit菜单:- 实现 del(删除单元格内容);- 实现 cut(剪切单元格内容);- 实现 select(选择行、列,全部);
- 添加 Find对话框(查找);



一、完善Edit菜单

※ 实现del(删除单元格内容)

绑定del 动作和 Spreadsheet 对象间的信号槽:





selectedItems() 是 QTableWidget 的成员函数,它会返回一个包含了所有被选中的 QTableWidgetItem 对象指针的 QList。在delete 之前 执行 setText() 是为了让 Spreadsheet 对象发送 itemChanged 信号,进而调用到槽函数 MainWindow::spreadsheetModified,spreadsheetModified 里会设置主窗口的未保存修改标志(windowModified)为 true,且更新主窗口的状态栏信息。

foreach(variable, container)说明

1) foreach 是 Qt 自己定义的关键字,用于顺序遍历 container(例如QList、QMap等)里的每一个 item。它的功能等同于 C++ 里的迭代器,只是代码更简洁。

2) 对于QMap 、QHash等用于保存(key, value) 的容器,foreach 默认遍历value值,一般用法如下:
QMap<QString, int> map; foreach (const QString &str, map.keys()) qDebug() << str << ':' << map.value(str);

运行效果:



※ 实现cut(剪切单元格内容)

cut 操作可以等效于前面实现过的 copy + del,即:



运行效果:



※ 实现 select(选择行、列,全部)

绑定 select 动作和MainWindow 对象间的信号槽:



其中,selectAll() 则 QTableWidget(Spreadsheet的父类)自带的槽函数,直接使用即可。

selectCurrentRow() 和 selectCurrentColumn() 在 Spreadsheet 类里定义:



这里涉及的4个函数(selectRow、currentRow、selectColumn、currentColmn)均为QTableWidget(Spreadsheet的父类)的成员函数。

运行效果:



※ 添加 Find对话框

Find 对话框的界面是之前通过纯C++代码就实现好的,这里只是将其整合到 Spreadsheet 里,回顾一下 Find 对话框的界面:



绑定 find 动作和 MainWindow 对象的信号槽:





回顾一下,Find 对话框类 FindDialog 是通过子类化 QDialog 而来的。当用户第一次激活 Find 动作时,应该 new 一个 FindDialog 对象,并为它和 Spreadsheet 对象绑定相关的信号槽,然后显示 Find 对话框。以后用户再激活 Find 动作时,则不再需要 new FindDialog,而是直接显示 Find 对话框。

show()、raise()、activateWindow()是为了让Find 对话框处于激活状态并且称为顶层窗口。

FindDialog 里定义了2个信号:



信号只需要定义不需要实现,这里 FindDialog 的 findNext 信号和 Spreadsheet 的 findNext 槽函数的定义一模一样的,但不用担心,这不会影响程序正常运行。

以findNext信号为例,走一遍流程:
Find 按钮被按下 -> findClicked() -> 如果backwardCheckBox被未选中 -> FindDialog 发送 findNext 信号 -> 执行 Spreadsheet 的槽函数findNext -> 搜索单元格

finNext如何实现搜索?



findNext 实现的是从当前选中的单元格的下一个单元格开始查找,formula 会返回单元格的内容,如果某个单元格的内容包含了指定的字符串,则选中该单元格(setCurrentCell),并且激活MainWindow (activateWindow)。findPre 操作和 finNext类似,这里不再赘述。

FindDialog 对象何时会被销毁?

Qt 会在删除父对象的时候自动删除其所有的子对象,FindDialog 对象的父对象是MainWindow 对象,所以,当 MainWindow 被关闭时,FindDialog 对象也会自动被销毁。

运行效果:



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

最近有在坚持游泳,游完后浑身轻松,精神倍爽,非常推荐程序员去游泳健身,这篇文章就是一边啃西瓜一边记录下来的,一不小心就熬夜了。。。



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


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

鲜花

握手

雷人

路过

鸡蛋

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