Qt Modeless Destroction Destruction - PullRequest
5 голосов
/ 15 августа 2011

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

MyDialog* dlg = new MyDialog(this);
dlg->show();
dlg->raise();

Так как exec () игнорирует модальное свойство.Однако теперь происходит утечка памяти, поскольку ничто не освобождает память, на которую указывает указатель dlg, до тех пор, пока приложение не будет закрыто.Я нашел одно решение здесь http://tinf2.vub.ac.be/~dvermeir/manuals/KDE20Development-html/ch08lev1sec3.html#ch08list09 в конце страницы, и мне было интересно, есть ли менее громоздкий способ использования немодального диалога.

Ответы [ 3 ]

5 голосов
/ 16 августа 2011

Вы можете использовать атрибут Qt :: WA_DeleteOnClose , чтобы уничтожить окно, когда оно закрыто / скрыто, и QWeakPointer (или QPointer) со статической переменной для отслеживания существованияокно внутри слота / функции, которое его открывает:

void MyWindow::openDialog() {    
    static QWeakPointer<MyDialog> dlg_;
    if (!dlg_)
        dlg_ = new MyDialog(this);

    MyDialog *dlg = dlg_.data();
    dlg->setAttribute(Qt::WA_DeleteOnClose);
    dlg->show();
    dlg->raise();
    dlg->activateWindow();
}
2 голосов
/ 17 августа 2011

Лично я бы выбрал либо использовать

dlg->setAttribute(Qt::WA_DeleteOnClose);

или сделать диалог динамически выделяемым элементом, то есть создать его только один раз:

// constructor
  : dialog_(0)

// member function
{
  if (! dialog_)
    dialog_ = new MyDialog(this);

  dialog_->show();
  dialog_->raise();
}

Таким образом, диалог удаляется, когда родитель умирает, и его нужно создать только один раз.

2 голосов
/ 15 августа 2011

Я бы запланировал его удаление в тот момент, когда его работа завершена с использованием deleteLater :

void MyDialog::MyDialog(QWidget *parent) {
    // ...
    connect(this, SIGNAL(finished(int)), SLOT(deleteLater)));
}

Этот подход не позволит вам проверить егопосле того, как был выдан сигнал finished (если только вы не можете гарантировать, что какие-либо обращения произойдут до того, как все вернется в цикл обработки событий, когда удаление фактически выполняется).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...