2017-01-09 18 views
0

私は自分のコントローラをやっています。 Qt - ハッシュテーブルに不正な値が含まれています

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

、次のように setCurrentItem()方法は次のとおりです:私は私のListWidget内の項目をクリックすると、以下のメソッドが呼び出されます( m_current_itemはプライベート変数である):今すぐ

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

、ときに私が連絡先を作成し、QListWidgetにアイテムを追加しますが、Contactオブジェクトも作成しますが、QHashにもバインドしていますので、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を確認する必要があります)

関連する問題