我在做我的控制器。当我单击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对应于什么。简而言之,这就是我所做的: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);}现在,当单击Contact时,我激活了编辑按钮,我想检索相应的QListWidgetItem对象。但是,这样做时,Contact对象似乎并不正确。确实,如果我对他使用一种方法(例如Contact),我的应用程序立即崩溃。这是我所做的: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;知道我做错了什么吗? 最佳答案 您的哈希类型为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,因为列表小部件不一定选择了某个项目。)关于c++ - Qt-哈希表包含不正确的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41556823/ 10-10 18:11