Да, вам, вероятно, следует сохранить какой-то список ваших диалогов, чтобы отслеживать, какие из них уже открыты. Если ваш GroupID - это ваш уникальный идентификатор, вы можете сделать что-то вроде этого:
QMap DialogMap;
void foo :: treeWidget_itemClicked (QTreeWidgetItem * item, столбец nt)
{
.....
QString groupID = item-> data (0, Qt :: UserRole) .toString ();
if (! DialogMap.contains(groupID))
{
// Popup the dialog and add it to map
...
DialogMap.insert(groupID, pGroupDialogContainer);
}
}
Теперь для другой части. Самое главное, что вам нужно удалить элемент с карты, когда диалоговое окно закрывается. Затем вы можете либо удалить диалоговое окно, либо я бы предложил, чтобы диалоговое окно само удалялось при его закрытии, как показано ниже:
// set automatic deletion of object on close
setAttribute(Qt::WA_DeleteOnClose);
Но, как я уже сказал, вам все равно нужно удалить диалоговое окно с карты, иначе у вас будет плохой указатель, и ваш код все равно будет думать, что диалоговое окно открыто.
Так что вам понадобится какой-то сигнал из диалога, чтобы указать, что он закрывается. Есть завершенный (int result) сигнал, который вызывается, когда вы запускаете результат:
Этот сигнал испускается, когда
код результата диалога был установлен,
либо пользователем, либо по телефону
done (), accept () или reject ().
Но вы всегда можете создать свой собственный сигнал в своем диалоге и выдать его, когда в вашем диалоге вызывается closeEvent.
Затем в коде, который обрабатывает карту ...
connect( pGroupDialogContainer, SIGNAL(WindowClosed()), this, SLOT(vCleanUpTheMap()));
...
void vCleanUpTheMap()
{
GroupDialogContainer *pDialog = dynamic_cast<GroupDialogContainer *>(sender());
if (pDialog)
{
// Just to keep things clean disconnect from the dialog.
disconnect(pDialog);
// I am assuming that you can get the key groupID from the dialog
// Cause it's a lot easier to remove from a map with the key
DialogMap.remove(pDialog->GetGroupID());
}
}
И это все.