Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: XandoX от Июль 25, 2007, 14:15



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


Название: QMainWindow и дочерние диалоги
Отправлено: QCasper от Июль 25, 2007, 15:23
Можно, например, в closeEvent закрыть эти все диалоги, или сигнал QApplication::aboutToQuit() соединить со слотом close каждого диалога.
Хотя я подозреваю, что есть более простое и красивое решение.


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

Код:

app.setQuitOnLastWindowClosed(true);


app - QApplication.

Тогда выход будет, когда последнее окно без родителя (0), главное окно имеет установленный флаг Qt::WA_QuitOnClose. По-умолчанию на всех окнах кроме: splash screens, tool windows, and popup menus


Название: QMainWindow и дочерние диалоги
Отправлено: vaprele07 от Июль 25, 2007, 15:59
SABROG, много всего писать приходится, проще будет всем иметь парентом главное окно и в методе closeEvent главного окна  сделать себе харакири: delete this;


Название: QMainWindow и дочерние диалоги
Отправлено: pastor от Июль 25, 2007, 16:07
Цитата: "vaprele07"
и в методе closeEvent главного окна  сделать себе харакири: delete this;


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

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


Название: QMainWindow и дочерние диалоги
Отправлено: XandoX от Июль 26, 2007, 08:20
дык, диалог создаю в конструкторе главного окна

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

а вот про то что главное окно создается в стеке я и забыл, поэтому и access vialation выподал видать. теперь все ясно.


Название: QMainWindow и дочерние диалоги
Отправлено: QCasper от Июль 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();
}


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


Название: QMainWindow и дочерние диалоги
Отправлено: pastor от Июль 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();
}


Название: QMainWindow и дочерние диалоги
Отправлено: QCasper от Июль 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 не срабатывает по закрытию последнего окна...


Название: QMainWindow и дочерние диалоги
Отправлено: pastor от Июль 26, 2007, 12:26
При закрытии главного окна, диалоги не закрываються, они хайдятся. В результате приложение остаеться висеть в памяти.


Название: QMainWindow и дочерние диалоги
Отправлено: QCasper от Июль 26, 2007, 12:54
Цитата: "pastor"
При закрытии главного окна, диалоги не закрываються, они хайдятся. В результате приложение остаеться висеть в памяти.


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


Название: QMainWindow и дочерние диалоги
Отправлено: XandoX от Июль 27, 2007, 09:44
Цитата: "QCasper"
Цитата: "pastor"
При закрытии главного окна, диалоги не закрываються, они хайдятся. В результате приложение остаеться висеть в памяти.


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


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


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


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


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


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


Название: QMainWindow и дочерние диалоги
Отправлено: XandoX от Июль 27, 2007, 11:39
Цитата: "QCasper"
Цитата: "XandoX"
Цитата: "QCasper"
Цитата: "pastor"
При закрытии главного окна, диалоги не закрываються, они хайдятся. В результате приложение остаеться висеть в памяти.


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


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


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


сори, что-то я ступил