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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QMainWindow и дочерние диалоги  (Прочитано 10087 раз)
XandoX
Гость
« : Июль 25, 2007, 14:15 »

Блин никак не могу понять. Есть значит MainWindow в нем создаю посредствам new еще парачку не модальных диалогов, тоесть висят себе и все, но когда закрываю главное окно приложение не завершается пока не закрою сами деалоги. Пробовал перегрузить quit, hide в MainWindow но они не вызываються, поставил флаг WA_QuitOnClose, не помогает, ставил флаг Qt::WA_DeleteOnClose получаю access vialation на выходе, что делать, как это исправить, подскажите плиз.
Записан
QCasper
Гость
« Ответ #1 : Июль 25, 2007, 15:23 »

Можно, например, в closeEvent закрыть эти все диалоги, или сигнал QApplication::aboutToQuit() соединить со слотом close каждого диалога.
Хотя я подозреваю, что есть более простое и красивое решение.
Записан
SABROG
Гость
« Ответ #2 : Июль 25, 2007, 15:41 »

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

Код:

app.setQuitOnLastWindowClosed(true);


app - QApplication.

Тогда выход будет, когда последнее окно без родителя (0), главное окно имеет установленный флаг Qt::WA_QuitOnClose. По-умолчанию на всех окнах кроме: splash screens, tool windows, and popup menus
Записан
vaprele07
Гость
« Ответ #3 : Июль 25, 2007, 15:59 »

SABROG, много всего писать приходится, проще будет всем иметь парентом главное окно и в методе closeEvent главного окна  сделать себе харакири: delete this;
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Июль 25, 2007, 16:07 »

Цитата: "vaprele07"
и в методе closeEvent главного окна  сделать себе харакири: delete this;


Бред!!! Зачем такое нужно?

2 XandoX: Приведи код, как ты создал диалоги. Установил литы парента для диалогов? Для главного окна поставь setAttribute(Qt::WA_DeleteOnClose). При этом главное окно должно быть создано димамичски (не в стеке!)
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
XandoX
Гость
« Ответ #5 : Июль 26, 2007, 08:20 »

дык, диалог создаю в конструкторе главного окна

типа dialog=new cMyDialog(this);

а вот про то что главное окно создается в стеке я и забыл, поэтому и access vialation выподал видать. теперь все ясно.
Записан
QCasper
Гость
« Ответ #6 : Июль 26, 2007, 10:00 »

Код:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
scukkotest *w = new scukkotest;
w->setAttribute(Qt::WA_DeleteOnClose);
w->show();
a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
return a.exec();
}
scukkotest::scukkotest(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
QDialog *d1 = new QDialog(this);
QDialog *d2 = new QDialog(this);

d1->show();
d2->show();
}


При закрытии главного окна диалоги закрываются (ну закрываются или нет, вобщем пропадают), а приложение не выгружается.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Июль 26, 2007, 10:55 »

Цитата: "QCasper"

При закрытии главного окна диалоги закрываются (ну закрываются или нет, вобщем пропадают), а приложение не выгружается.


Да, есть такое. Забыл совсем про это. Тогда пишем так

Код:
void scukkotest::closeEvent( QCloseEvent *evt )
{
    foreach (QWidget *widget, QApplication::topLevelWidgets())
        widget->close();
}


или

Код:
void scukkotest::closeEvent( QCloseEvent *evt )
{
    foreach (QWidget *widget, findChildren<QDialog *>())
  widget->close();
}
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
QCasper
Гость
« Ответ #8 : Июль 26, 2007, 12:11 »

Цитата: "pastor"
Цитата: "QCasper"

При закрытии главного окна диалоги закрываются (ну закрываются или нет, вобщем пропадают), а приложение не выгружается.


Да, есть такое. Забыл совсем про это. Тогда пишем так

Код:
void scukkotest::closeEvent( QCloseEvent *evt )
{
    foreach (QWidget *widget, QApplication::topLevelWidgets())
        widget->close();
}


или

Код:
void scukkotest::closeEvent( QCloseEvent *evt )
{
    foreach (QWidget *widget, findChildren<QDialog *>())
  widget->close();
}


ну это то понятно... Непонятно, почему слот quit не срабатывает по закрытию последнего окна...
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #9 : Июль 26, 2007, 12:26 »

При закрытии главного окна, диалоги не закрываються, они хайдятся. В результате приложение остаеться висеть в памяти.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
QCasper
Гость
« Ответ #10 : Июль 26, 2007, 12:54 »

Цитата: "pastor"
При закрытии главного окна, диалоги не закрываються, они хайдятся. В результате приложение остаеться висеть в памяти.


А разве разрушение главного не влечет за собой разрушение  диалогов, учитывая, что они дочерние?
Записан
XandoX
Гость
« Ответ #11 : Июль 27, 2007, 09:44 »

Цитата: "QCasper"
Цитата: "pastor"
При закрытии главного окна, диалоги не закрываються, они хайдятся. В результате приложение остаеться висеть в памяти.


А разве разрушение главного не влечет за собой разрушение  диалогов, учитывая, что они дочерние?


так, там то и все дело, что они не совсем дочернии. точнее они совсем не дочерними, если им поставить флаг дочернее окно, типа, то они становяться модальными окнами. А раз так, то при закрытии главного окна, если открыты диалоги, оно вроди как скрываються, но тоже странным образом, слот hide() не отрабатывает. я еще не разобралься почему так происходит
Записан
QCasper
Гость
« Ответ #12 : Июль 27, 2007, 10:10 »

Цитата: "XandoX"
Цитата: "QCasper"
Цитата: "pastor"
При закрытии главного окна, диалоги не закрываються, они хайдятся. В результате приложение остаеться висеть в памяти.


А разве разрушение главного не влечет за собой разрушение  диалогов, учитывая, что они дочерние?


так, там то и все дело, что они не совсем дочернии. точнее они совсем не дочерними, если им поставить флаг дочернее окно, типа, то они становяться модальными окнами. А раз так, то при закрытии главного окна, если открыты диалоги, оно вроди как скрываються, но тоже странным образом, слот hide() не отрабатывает. я еще не разобралься почему так происходит


Почему это не дочернии, например в том коде, что я здесь приводил, явно передаётся this в конструктор.
Записан
XandoX
Гость
« Ответ #13 : Июль 27, 2007, 11:39 »

Цитата: "QCasper"
Цитата: "XandoX"
Цитата: "QCasper"
Цитата: "pastor"
При закрытии главного окна, диалоги не закрываються, они хайдятся. В результате приложение остаеться висеть в памяти.


А разве разрушение главного не влечет за собой разрушение  диалогов, учитывая, что они дочерние?


так, там то и все дело, что они не совсем дочернии. точнее они совсем не дочерними, если им поставить флаг дочернее окно, типа, то они становяться модальными окнами. А раз так, то при закрытии главного окна, если открыты диалоги, оно вроди как скрываються, но тоже странным образом, слот hide() не отрабатывает. я еще не разобралься почему так происходит


Почему это не дочернии, например в том коде, что я здесь приводил, явно передаётся this в конструктор.


сори, что-то я ступил
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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