1. <track id="ob6no"><strike id="ob6no"><tt id="ob6no"></tt></strike></track>

      <track id="ob6no"></track>

      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時,創建一個新窗口。當第二次,雙擊同一個列表項時,直接從哈希表中查找窗口的地址即可,不需要再次創建,就解決了上面的問題。界面如下:

      發表評論
      評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
      操你啦,操你啦视频,操你啦影院,操你啦网站