Откройте только один экземпляр QDialog с помощью show (), а также удалит ли объект, если я закрою QDialog - PullRequest
1 голос
/ 02 июня 2011

в Qt я открываю окна QDialog каждый раз, когда я нажимаю на какой-то элемент, который я делаю с новым, я хочу быть уверен, что я открываю только один экземпляр QDialog для каждого элемента, который нажимаю:нужно сохранить какой-то хэш или вектор GroupDialogContainer?также мой второй вопрос: каждый раз, когда я закрываю окно QDialog с помощью close (), объект pGroupDialogContainer, который отвечал за его открытие, уничтожается?или мне нужно удалить его, когда я обнаружил, что QDIalog закрылся?

1 Ответ

1 голос
/ 03 июня 2011

Да, вам, вероятно, следует сохранить какой-то список ваших диалогов, чтобы отслеживать, какие из них уже открыты. Если ваш 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());
   }
}

И это все.

...