Russian Qt Forum

Qt => Общие вопросы => Тема начата: foufou от Октябрь 20, 2010, 22:00



Название: закрытие MDI дочернего окна
Отправлено: foufou от Октябрь 20, 2010, 22:00
Пытаюсь сделать так, чтобы дочернее MDI окно само себя закрыло. Типа пишется сообщение "введены неправильные данные" после чего окно закрывается.
Пишу после выдачи MessageBox:
this->close().

Это приводит к тому, что очищается вся форма дочернего окна и остается пустой прямоугольник формы с тремя кнопками в заголовке.
Не мог ли мне кто-нибудь подсказать, как правильно дочернему окну застрелиться ?

Создавалось дочернее окно так:

formTable *childTable = new formTable;
QMdiSubWindow *subWindow = mdiArea->addSubWindow(childTable);
subWindow->setWindowIcon(QIcon(":/images/table.png"));

форму дочернего окна накидал в дизайнере.


Название: Re: закрытие MDI дочернего окна
Отправлено: Anarion от Октябрь 20, 2010, 23:12
Не знаю, как с точки зрения здравого смысла, но, например.
Когда добавляете окно в MDI получаете указатель на это самое окно,
Код
C++ (Qt)
QMdiSubWindow *subWindow = mdiArea->addSubWindow(childTable);

Можно в вашем классе дочернего окно объявить эту же переменную:
Код
C++ (Qt)
QMdiSubWindow *subWindow;

и инициализировать ее при добавлении:
Код
C++ (Qt)
QMdiSubWindow *subWindow = mdiArea->addSubWindow(childTable);
childTable->subWindow = subWindow;

В самом же дочернем описать метод, например:
Код
C++ (Qt)
void formTable::quitSub()
{
 subWindow->close();
}


Название: Re: закрытие MDI дочернего окна
Отправлено: foufou от Октябрь 20, 2010, 23:28
Спасибо за ответ !

Удалил вот таким вот методом (помоему, несколько извратным) :

foreach (QWidget *win, QApplication::topLevelWidgets())
        {
            if (MainWindow *mainWin = qobject_cast<MainWindow *>(win))
            {
                QMdiSubWindow *subWindow = mainWin->mdiArea->activeSubWindow();
                subWindow->close();
            }
        }


Название: Re: закрытие MDI дочернего окна
Отправлено: Anarion от Октябрь 20, 2010, 23:44
Как альтернатива подобным образом можно установить имя для MDI области методом
Код
C++ (Qt)
setObjectname("MainW");

А затем искать по всем виджетам нужное имя.
Код
C++ (Qt)
  QWidgetList wList = QApplication::allWidgets();
  foreach (QWidget *pW, wList)
  {
    if (pW->objectName()==QString("MainW"))
    {
       ...
    }
  }


Название: Re: закрытие MDI дочернего окна
Отправлено: panAlexey от Октябрь 20, 2011, 22:55
В самом же дочернем описать метод, например:
Код
C++ (Qt)
void formTable::quitSub()
{
 subWindow->close();
}
заюзал.


Название: Re: закрытие MDI дочернего окна
Отправлено: GraninDm от Май 17, 2012, 10:08
Может кому пригодится...

void myMDIForm::on_buttonClose_clicked()
{
        qobject_cast<QMdiSubWindow*>(parent())->close();
}

Первоисточник
http://lists.trolltech.com/qt-interest/2007-10/msg00277.html (http://lists.trolltech.com/qt-interest/2007-10/msg00277.html)