2017-01-09 122 views
0

我在做我的控制器。當我點擊我的ListWidget的項目,下面的方法被稱爲:Qt - 哈希表包含不正確的值

void ContactBookController::setCurrentlySelectedItem(QListWidgetItem *item) 
{ 
    setCurrentItem(*item); 
    m_window.setEditButtonsState(true); 
} 

而且setCurrentItem()方法如下:(m_current_item爲私有變量):

void ContactBookController::setCurrentItem(const QListWidgetItem &current_item) 
{ 
    m_current_item = current_item; 
} 

現在,當我創建一個聯繫人,我添加一個項目到QListWidget,但我也創建了一個Contact對象,但我也將它們綁定在一起,所以我知道QListWidgetItem對應於什麼Contact。總之,這裏是我做過什麼:

void ContactBookController::createContact() 
{ 
    auto new_contact = m_contact_book.createContact(); 

    if(new_contact != nullptr) 
    { 
     new_contact->setName(tr("New contact")); 
    } 

    auto list_item = m_window.createContact(new_contact->getName()); 
    m_window.clearSelection(); 
    m_contact_map.insert(list_item, new_contact); 
} 

現在,在QListWidgetItem點擊時,我激活編輯按鈕,我想獲取相應的Contact對象。但是,這樣做時,Contact對象似乎不正確。事實上,如果我使用他的方法(如getName()),我的應用程序立即崩潰。

這裏是我做過什麼:

void ContactBookController::editContact() 
{ 
    auto list_item = m_current_item; 
    auto contact = m_contact_map.value(&list_item); /* doesn't work */ 
} 

我的哈希表被宣佈爲:

QHash<QListWidgetItem*, Contact*> m_contact_map; 

任何想法,我做錯了什麼?

回答

2

你的散列表的類型爲QHash<QListWidgetItem*, Contact>。因此,將項目指針映射到聯繫人值。

當您使用m_contact_map.insert(list_item, new_contact)保存特定項目的映射時,可以將項目指針中的映射添加到聯繫人。但是,當您嘗試檢索與m_contact_map.value(&list_item)的聯繫人時,請將指針的指針的值查找到本地list_item變量,該變量指向堆棧中的某處,並且與指向顯示的項目的指針無關風景。

要麼您需要保存到指向所選值的指針,即將m_current_item設爲QListWidgetItem *m_current_item,要麼只需使用QListWidget::currentItem()即可檢索當前項目,而無需額外的成員變量。

(注意:您應該檢查currentItem() != nullptr,因爲列表小部件不一定選擇了某個項目。)