久久精品国产清自在天天线_日韩国产欧美系列_亚洲天堂影视在线观看_91在线艹亚洲无码午夜_日本写真高清视频免费网站网_亚州无码大尺度另类_高跟翘臀老师后进式视频午夜_久久精品国产亚洲AV热黑人_国产另ts另类人妖_丁香五月 开心五月 激情五月

Hi,歡迎來到嵌入式培訓(xùn)高端品牌 - 華清遠(yuǎn)見教育科技集團(tuán)<北京總部官網(wǎng)>,專注嵌入式工程師培養(yǎng)15年!
當(dāng)前位置: > 華清遠(yuǎn)見教育科技集團(tuán) > 嵌入式學(xué)習(xí) > 講師博文 > 哈希表在QT中的應(yīng)用舉例
哈希表在QT中的應(yīng)用舉例
時(shí)間:2017-01-05作者:華清遠(yuǎn)見

哈希表,是根據(jù)關(guān)鍵碼值(Key value)而直接進(jìn)行訪問的數(shù)據(jù)結(jié)構(gòu)。也就是說,它通過把關(guān)鍵碼值映射到表中一個(gè)位置來訪問記錄,以加快查找的速度。

QHash是QT類庫中的一個(gè)容器類,內(nèi)部維護(hù)了一張哈希表。QHash的內(nèi)部哈希表每次翻倍增長,同時(shí)所有的內(nèi)部元素都重新分配到桶內(nèi)。計(jì)算公式為qHash(key)%QHash::capacity() (桶的個(gè)數(shù))。下面通過一個(gè)例子,來說明QHash類的使用。

這個(gè)例子中的主窗口,類似QQ的好友列表,雙擊一個(gè)好友,彈出聊天對(duì)話框,標(biāo)題顯示chat with +列表框中的內(nèi)容。多次雙擊同一個(gè)好友,應(yīng)該只有第一次彈對(duì)話框。

代碼為:

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

當(dāng)多次雙擊同一個(gè)列表項(xiàng)時(shí),如下圖所示,同樣的窗口彈出了多個(gè),邏輯上不合理。

為了解決這個(gè)問題,需要用到哈希表,用到QHash類。

實(shí)現(xiàn)過程如下:

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

#include <QHash>

2) 在類中加入一個(gè)私有成員:

QHash<QString, ChatDialog *> chatFormHash;

3) 做信號(hào)和槽的關(guān)聯(lián)

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

4) 實(shí)現(xiàn)newWindow()函數(shù)

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();

列表框中的列表項(xiàng)字符串,作為哈希表中的key值,聊天窗口的地址做為哈希表的value.當(dāng)哈希表中沒有某個(gè)key時(shí),創(chuàng)建一個(gè)新窗口。當(dāng)?shù)诙�,雙擊同一個(gè)列表項(xiàng)時(shí),直接從哈希表中查找窗口的地址即可,不需要再次創(chuàng)建,就解決了上面的問題。界面如下:

發(fā)表評(píng)論
評(píng)論列表(網(wǎng)友評(píng)論僅供網(wǎng)友表達(dá)個(gè)人看法,并不表明本站同意其觀點(diǎn)或證實(shí)其描述)