Qt示例 | 地址簿例子 Address Book Example(二)

223 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情

注:示例为Qt 5.1.1中的示例。
本文旨在剖析Qt示例的源码,总结函数使用方法以及编程思想,提高自己的编程能力。

示例运行效果:

1.gif

文件目录:

image.png

具体实现:

AddressWidget类:

image.png

  • AddressWidget类继承自QTabWidget(选项卡小部件)。选项卡小部件提供了一个选项卡栏(参见QTabBar)和一个“页面区域”,用于显示与每个选项卡相关的页面。默认情况下,标签栏显示在页面区域的上方,但也可以使用不同的配置(参见TabPosition)。每个选项卡都与一个不同的小部件(称为页面)相关联。页面区域只显示当前页面;所有其他页面都是隐藏的。用户可以通过点击其标签或按下Alt+字母快捷键来显示不同的页面。
  • AddressWidget类是本例中的主要类,它提供了添加(addEntry)、编辑(editEntry)和删除(removeEntry)联系人、将联系人保存到文件(writeToFile)和从文件加载联系人(readFromFile)的功能。
  • 该类中还包含一个信号selectionChanged,通知MainWindow选中的行发生了变化。
  • setupTabs()是一个私有函数,主要用来实现标签的创建。
  • 三个成员变量分别是TableModel实例、NewAddressTab实例和QSortFilterProxyModel实例。

构造函数:

image.png

AddressWidget构造中主要实现了实例化NewAddressTab和TableModel。并连接NewAddressTab的sendDetails信号到addEntry槽函数。添加NewAddressTab页,并使用setupTabs()设置9个TableMoodel页选项卡。

addEntry函数(无参):

image.png

这个函数同NewAddressTab中的addEntry函数,实例化一个AddDialog对象,弹出添加数据的弹框。然后调用带参的addEntry函数来真正的将联系人添加到表中。

addEntry函数(有参):

image.png

基本验证是在这个addEntry()函数中完成的,主要实现了防止地址簿中出现重复条目。
如果要插入的数据没有在列表中,那么在table的顶部中插入一行,并将"name"设置到第一个项中,"address"设置到第二个项中。注:编辑模式在这个示例中没有用到。
此时因为表中已经有数据了,所以调用removeTab将添加页删除。
如果有重复的,就会弹出一个提示框。

contains: 如果列表中包含值,则返回true;否则返回false。
indexOf: 返回小部件占用的页面的索引位置,如果找不到小部件,则返回-1。
QMessageBox: QMessageBox类提供了一个模态对话框,用于通知用户或向用户提示信息并接收回复。

editEntry函数:

image.png

编辑条目用来更新联系人地址。本示例中的姓名是不允许修改的。
首先,我们使用QTabWidget::currentWidget()获取活动标签的QTableView对象。然后,我们从tableView中提取selectionModel来获取所选索引。接下来,从用户想要编辑的行提取数据。将该数据显示在AddDialog的实例中。并且只有当对对话框中的数据进行了更改时,表才会更新。

removeEntry函数:

image.png

使用removeEntry()函数删除条目。
通过QItemSelectionModel对象selectionModel来访问所选行,从而删除所选行。当用户删除了地址簿中的所有联系人时,newAddressTab会重新添加到AddressWidget中。

setupTabs函数:

image.png

setupTabs()函数用于设置AddressWidget中的9个字母组标签、表视图和代理模型。每个代理模型依次被设置为根据使用不区分大小写的QRegExp对象的相关字母组过滤联系人名称。表视图也使用相应的代理模型的sort()函数按升序排序。
每个表视图的selectionMode设置为QAbstractItemView::SingleSelection, selectionBehavior设置为QAbstractItemView::SelectRows,允许用户同时选择一行中的所有项。每个QTableView对象都会自动给出一个QItemSelectionModel,用于跟踪所选索引。

readFromFile函数:

image.png

readFromFile()函数加载一个包含地址簿中所有联系人的文件,以前使用writeToFile()保存。QDataStream用于将.dat文件的内容读入一对列表中,并使用addEntry()添加其中的每一对。

writeToFile函数: image.png

writeToFile()函数用于保存一个包含地址簿中所有联系人的文件。文件保存为自定义的“.dat”格式。qpair的QList的内容使用QDataStream写入文件。如果无法打开文件,会弹出QMessageBox提示错误信息。

未完待续...