哈希表在QT中的應(yīng)用舉例
時(shí)間:2017-01-05作者:華清遠(yuǎn)見(jiàn)
哈希表,是根據(jù)關(guān)鍵碼值(Key value)而直接進(jìn)行訪(fǎng)問(wèn)的數(shù)據(jù)結(jié)構(gòu)。也就是說(shuō),它通過(guò)把關(guān)鍵碼值映射到表中一個(gè)位置來(lái)訪(fǎng)問(wèn)記錄,以加快查找的速度。 QHash是QT類(lèi)庫(kù)中的一個(gè)容器類(lèi),內(nèi)部維護(hù)了一張哈希表。QHash的內(nèi)部哈希表每次翻倍增長(zhǎng),同時(shí)所有的內(nèi)部元素都重新分配到桶內(nèi)。計(jì)算公式為qHash(key)%QHash::capacity() (桶的個(gè)數(shù))。下面通過(guò)一個(gè)例子,來(lái)說(shuō)明QHash類(lèi)的使用。 這個(gè)例子中的主窗口,類(lèi)似QQ的好友列表,雙擊一個(gè)好友,彈出聊天對(duì)話(huà)框,標(biāo)題顯示chat with +列表框中的內(nèi)容。多次雙擊同一個(gè)好友,應(yīng)該只有第一次彈對(duì)話(huà)框。 代碼為:
QString id = ui->listWidget->currentItem()->text(); 當(dāng)多次雙擊同一個(gè)列表項(xiàng)時(shí),如下圖所示,同樣的窗口彈出了多個(gè),邏輯上不合理。
為了解決這個(gè)問(wèn)題,需要用到哈希表,用到QHash類(lèi)。 實(shí)現(xiàn)過(guò)程如下: 1) 首先,需要在界面類(lèi)中,引入頭文件. #include <QHash> 2) 在類(lèi)中加入一個(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(); 列表框中的列表項(xiàng)字符串,作為哈希表中的key值,聊天窗口的地址做為哈希表的value.當(dāng)哈希表中沒(méi)有某個(gè)key時(shí),創(chuàng)建一個(gè)新窗口。當(dāng)?shù)诙危p擊同一個(gè)列表項(xiàng)時(shí),直接從哈希表中查找窗口的地址即可,不需要再次創(chuàng)建,就解決了上面的問(wèn)題。界面如下:
相關(guān)資訊
發(fā)表評(píng)論
|