我正在做我的控制器。当我单击ListWidget中的项目时,将调用以下方法:
void ContactBookController::setCurrentlySelectedItem(QListWidgetItem *item)
{
setCurrentItem(*item);
m_window.setEditButtonsState(true);
}
setCurrentItem()
方法如下:(m_current_item
是私有变量):
void ContactBookController::setCurrentItem(const QListWidgetItem ¤t_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;
知道我做错了什么吗?
答案 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
,因为列表小部件不一定会选择一个项目。)