Hi,欢迎来到嵌入式培训高端品牌 - 华清远见教育科技集团<北京总部官网>,专注嵌入式工程师培养15年!
当前位置: > 华清远见教育科技集团 > 嵌入式学习 > 讲师博文 > 哈希表在QT中的应用举例
哈希表在QT中的应用举例
时间:2017-01-05作者:华清远见

哈希表,是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。

QHash是QT类库中的一个容器类,内部维护了一张哈希表。QHash的内部哈希表每次翻倍增长,同时所有的内部元素都重新分配到桶内。计算公式为qHash(key)%QHash::capacity() (桶的个数)。下面通过一个例子,来说明QHash类的使用。

这个例子中的主窗口,类似QQ的好友列表,双击一个好友,弹出聊天对话框,标题显示chat with +列表框中的内容。多次双击同一个好友,应该只有第一次弹对话框。

代码为:

QString id = ui->listWidget->currentItem()->text();
        ChatDialog *dialog = new ChatDialog(id, this);
        dialog->show();

当多次双击同一个列表项时,如下图所示,同样的窗口弹出了多个,逻辑上不合理。

为了解决这个问题,需要用到哈希表,用到QHash类。

实现过程如下:

1) 首先,需要在界面类中,引入头文件.

#include <QHash>

2) 在类中加入一个私有成员:

QHash<QString, ChatDialog *> chatFormHash;

3) 做信号和槽的关联

QObject::connect(ui->listWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)),this, SLOT(newWindow()));

4) 实现newWindow()函数

QString id = ui->listWidget->currentItem()->text();
        ChatDialog *dialog;
        if (this->chatFormHash.contains(id))
        {
                dialog = chatFormHash.value(id);
        }
        else
        {
                dialog = new ChatDialog(id, this);
                this->chatFormHash.insert(id, dialog);
        }
        dialog->show();

列表框中的列表项字符串,作为哈希表中的key值,聊天窗口的地址做为哈希表的value.当哈希表中没有某个key时,创建一个新窗口。当第二次,双击同一个列表项时,直接从哈希表中查找窗口的地址即可,不需要再次创建,就解决了上面的问题。界面如下:

发表评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)