Qt - 哈希表包含不正确的值

时间:2017-01-09 20:59:16

标签: c++ qt

我正在做我的控制器。当我单击ListWidget中的项目时,将调用以下方法:

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对象,但我也将它们绑定在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;

知道我做错了什么吗?

1 个答案:

答案 0 :(得分: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,因为列表小部件不一定会选择一个项目。)