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

в Qt я открываю окна QDialog каждый раз, когда я щелкаю какой-либо элемент, я делаю это с новым, мне нравится быть уверенным, что я открываю только один экземпляр QDialog для каждого элемента, на который я нажимаю:

void foo::treeWidget_itemClicked(QTreeWidgetItem *item,nt column)                                               
    .....
    QString groupID = item->data(0, Qt::UserRole).toString();
    QString groupName = item->text(0);
    GroupDialogContainer* pGroupDialogContainer = new GroupDialogContainer(groupID,                                                                               groupName,                                                                                   this);

    pGroupDialogContainer->show();

}

class GroupDialogContainer : public QDialog
{
    Q_OBJECT


public:
    GroupDialogContainer(QString GroupId,QString GroupName,QWidget *parent=0); 
    GroupDialogContainer(QWidget *parent=0);
    virtual ~GroupDialogContainer();
    Ui::GroupDialog ui;

public slots:
    void closeEvent(QCloseEvent *event);
};

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


person user63898    schedule 02.06.2011    source источник
comment
Можете ли вы объяснить немного больше о том, что делает GroupDialogContainer, или опубликовать код.   -  person Abhijith    schedule 02.06.2011
comment
это просто класс, который наследуется от QDialog   -  person user63898    schedule 02.06.2011
comment
при вызове QDialog-›show() ваш пользовательский интерфейс будет заблокирован до тех пор, пока QDialog не будет закрыт, если только у вас нет немодального диалога. Поэтому я не понимаю, как у вас возникнет проблема с несколькими диалогами.   -  person Abhijith    schedule 02.06.2011


Ответы (1)


Да, вам, вероятно, следует вести какой-то список ваших диалогов, чтобы отслеживать, какие из них уже открыты. Если ваш GroupID является вашим уникальным идентификатором, вы можете сделать что-то вроде этого:

Диалоговая карта QMap;

void foo::treeWidget_itemClicked(QTreeWidgetItem *item,nt column) {
..... 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);

Но, как я уже сказал, вам все равно нужно будет удалить диалоговое окно с карты, иначе у вас будет неправильный указатель, и ваш код все равно будет думать, что диалоговое окно открыто.

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

И это все.

person Liz    schedule 02.06.2011
comment
только одна мысль ... функция подключения есть в каждом экземпляре, который я создаю? куда мне его положить? в функции, создающей pGroupDialogContainer treeWidget_itemClicked? или сделать глобальную переменную pGroupDialogContainer и поместить соединение в конструкцию или что-то в этом роде? - person user63898; 03.06.2011
comment
Если у вас может быть открыто более одного диалогового окна одновременно, то оно вам нужно там, где вы его создаете, потому что вам потребуется активное соединение для каждого диалогового окна, которое открыто в данный момент. - person Liz; 03.06.2011