好久没更新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。 ---------------------------------------------------------------------------------------------------------------------- |