Russian Qt Forum
Ноябрь 26, 2024, 00:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: закрытие MDI дочернего окна  (Прочитано 5660 раз)
foufou
Гость
« : Октябрь 20, 2010, 22:00 »

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

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

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

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

форму дочернего окна накидал в дизайнере.
Записан
Anarion
Гость
« Ответ #1 : Октябрь 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();
}
« Последнее редактирование: Октябрь 20, 2010, 23:25 от Anarion » Записан
foufou
Гость
« Ответ #2 : Октябрь 20, 2010, 23:28 »

Спасибо за ответ !

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

foreach (QWidget *win, QApplication::topLevelWidgets())
        {
            if (MainWindow *mainWin = qobject_cast<MainWindow *>(win))
            {
                QMdiSubWindow *subWindow = mainWin->mdiArea->activeSubWindow();
                subWindow->close();
            }
        }
Записан
Anarion
Гость
« Ответ #3 : Октябрь 20, 2010, 23:44 »

Как альтернатива подобным образом можно установить имя для MDI области методом
Код
C++ (Qt)
setObjectname("MainW");

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

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #4 : Октябрь 20, 2011, 22:55 »

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

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
GraninDm
Гость
« Ответ #5 : Май 17, 2012, 10:08 »

Может кому пригодится...

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

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

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.156 секунд. Запросов: 23.