Версия для печати темы
Форум на CrossPlatform.RU _ Qt Общие вопросы _ QApplication::quit() не срабатывает?
Автор: LE0N 12.3.2009, 21:03
В общем написал малюсенькую аппликуху. В которой имеется форма-матюкалка фатальных ошибок апликухи.
Которую показываю так
FatalMsg::display(QString &);
Хотелось бы, что бы после того, как отработает окно диалога (dlg->exec()) - т.е. закроется. Закрывалось всё приложение.
QApplication::quit() вообще ни чего не делает. (По крайней мере этого не видно)
QApplication::exit(-1) тоже.
QApplication a(argc, argv);
a.setQuitOnLastWindowClosed(true);
#######
#######
#В функции FatalMsg::display()
QApplication::closeAllWindows();
Просто закрывает все окна. А процесс так и остаётся висеть.....
Цитата(LE0N @ 12.3.2009, 20:00)
В общем написал малюсенькую программку. В которой имеется форма-матюкалка фатальных ошибок апликухи.
Которую показываю так
FatalMsg::display(QString &);
Хотелось бы, что бы после того, как отработает окно диалога (dlg->exec()) - т.е. закроется. Закрывалось всё приложение.
QApplication::quit() вообще ни чего не делает. (По крайней мере этого не видно)
QApplication::exit(-1) тоже.
QApplication a(argc, argv);
a.setQuitOnLastWindowClosed(true);
#######
#######
#В функции FatalMsg::display()
QApplication::closeAllWindows();
Просто закрывает все окна. А процесс так и остаётся висеть.....
ВЦ. Где кнопка редактировать?
Автор: panter_dsd 12.3.2009, 21:05
Приведи побольше кода.
Цитата
ВЦ. Где кнопка редактировать?
После 20 постов появится.
Автор: LE0N 12.3.2009, 21:11
main
int
main(int argc, char *argv[])
{
QApplication a(argc, argv);
a.setQuitOnLastWindowClosed(1);
QTextCodec::setCodecForTr(QTextCodec::codecForName("windows-1251"));
Loader *w=new Loader();
w->setWindowFlags(Qt::FramelessWindowHint);
w->show();
w->process();
return a.exec();
}
Loader::process()
void
Loader::process() {
this->set_progress_text("Получаем настройки программы");
QFile file(QApplication::applicationDirPath()+"/config/db.conf");
if(!file.exists()) {
FatalMsg::display("Не могу найти файл настроек БД");
}
}
FatalMsg::display
void
FatalMsg::display(const QString &str) {
FatalMsg *win=new FatalMsg();
win->ui.textBrowser->setText(tr(str.toAscii().data()));
win->exec();
delete win;
qApp->quit();
}
Автор: panter_dsd 12.3.2009, 21:20
Так w остается висеть...
Попробуй
Loader::process() {
this->set_progress_text("Получаем настройки программы");
QFile file(QApplication::applicationDirPath()+"/config/db.conf");
if(!file.exists()) {
FatalMsg::display("Не могу найти файл настроек БД");
}
this->close();
}
Автор: LE0N 12.3.2009, 21:25
Так в том то и дело, я хочу что бы СРАЗУ после FatalMsg::display, закрывалось всё приложение!
Может исключение какое выбрсить можно, аль ещё чего?
QApplication::closeAllWindows();
Как я уже и говорил, закрывает все окна, только в не зависимости от настройки setQuitOnLastWindowClosed(true), процесс остаётся висеть....
Автор: BRE 12.3.2009, 21:36
Цитата(LE0N @ 12.3.2009, 21:25)
Так в том то и дело, я хочу что бы СРАЗУ после FatalMsg::display, закрывалось всё приложение!
Может исключение какое выбрсить можно, аль ещё чего?
QApplication::closeAllWindows();
Как я уже и говорил, закрывает все окна, только в не зависимости от настройки setQuitOnLastWindowClosed(true), процесс остаётся висеть....
Ты запускаешь process, еще до запуска цикла обработки событий (который запускается a.exec()), поэтому quit() и не отрабатывает, ему еще останавливать нечего. Есть жОсткий метод: добавь ::exit( 0 ) в функцию display (после qApp->quit() или вместо).
А по хорошему, вызывай display после запуска цикла событий.
Автор: LE0N 12.3.2009, 21:40
Не помогло.
А как начать обработку ПОСЛЕ a.exec ?
К какому слоту прицепиться?
Автор: BRE 12.3.2009, 21:55
Цитата(LE0N @ 12.3.2009, 21:40)
Не помогло.
А у меня работает
:
void MainWindow::display()
{
QMessageBox::information( this, "Test", "Process..." );
::exit( 0 );
}
Цитата(LE0N @ 12.3.2009, 21:40)
А как начать обработку ПОСЛЕ a.exec ?
К какому слоту прицепиться?
Я не знаю что ты хочешь сделать?
Если вся работа происходит в process, замени в main:
return a.exec();
на
return 0;
Или можно запускать process нажатием кнопки или по таймеру наконец.
Много есть разных вариантов.
Автор: LE0N 12.3.2009, 22:07
Мне не нужно через задницу. Мне нужен толковый способ по запуску loader->process после a.exec без участия пользователя...
Автор: BRE 12.3.2009, 22:12
Цитата(LE0N @ 12.3.2009, 22:07)
Мне не нужно через задницу. Мне нужен толковый способ по запуску loader->process после a.exec без участия пользователя...
Если вся работа выполняется в process() и после его завершения программа должна закрыться (я так понимаю твою задачу):
void Loader::process() {
this->set_progress_text("Получаем настройки программы");
QFile file(QApplication::applicationDirPath()+"/config/db.conf");
if(!file.exists()) {
FatalMsg::display("Не могу найти файл настроек БД");
return;
}
// Дальнейшая работа
}
void
FatalMsg::display(const QString &str) {
FatalMsg win;
win.ui.textBrowser->setText(tr(str.toAscii().data()));
win.exec();
}
int
main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForName("windows-1251"));
Loader *w=new Loader();
w->setWindowFlags(Qt::FramelessWindowHint);
w->show();
w->process();
return 0;
}
Автор: LE0N 12.3.2009, 22:17
Нет. Работы после МНОГО. В том числе и работа с формами.
Блин. До таких вот решений я и сам додуматься могу.
Автор: BRE 12.3.2009, 22:21
Цитата(LE0N @ 12.3.2009, 22:17)
Нет. Работы после МНОГО. В том числе и работа с формами.
Блин. До таких вот решений я и сам додуматься могу.
Ээээ... не понял сообщения.
Что-то не так?
Автор: LE0N 12.3.2009, 22:30
Цитата
return;
}
// Дальнейшая работа
После лоадинга, у меня появляются формы. АЛГОРИТМ НЕ ЛИНЕЙНЫЙ!
Давайте перейдём от первоначального вопроса к
Цитата
запустить loader->process после a.exec без участия пользователя...
Автор: BRE 12.3.2009, 22:35
Цитата(LE0N @ 12.3.2009, 22:30)
Давайте перейдём от первоначального вопроса к
Цитата
запустить loader->process после a.exec без участия пользователя...
В конструкторе Loader:
QTimer::singleShot( 0, this, SLOT( process() ) );
Таймер сработает сразу после запуска цикла обработки событий.
process() - должен быть слотом.
Да, из main вызов process убрать.
Автор: SABROG 12.3.2009, 23:20
Я вот чего понять не могу. Если класс с проверкой настроек спецом вынесен отдельно от класса главного окна, чтобы ускорить загрузку программы и программа не делала лишних телодвижений по инициализации элементов управления, перевода текста и т.д. То нафига eventloop (.exec()) ? Тут либо возвращать true/false из метода и делать return из main'a, если далеко возвращаться, то exit(). Как так он может не работать?
Иначе использовать трюк как в example torrent, в конструкторе окна поместить в очередь эвентов вызов своего метода. Он вызовется ровно тогда, когда будет вызван exec():
QMetaObject::invokeMethod(this, "loadSettings", Qt::QueuedConnection);
Даже сам Designer не гнушается:
if (QLibraryInfo::licensedProducts() == QLatin1String("Console")) {
QMessageBox::information(0, tr("Qt Designer"),
tr("This application cannot be used for the Console edition of Qt"));
QMetaObject::invokeMethod(this, "quit", Qt::QueuedConnection);
return;
}
void QDesignerToolWindow::closeEvent(QCloseEvent *ev)
{
if (m_saveSettings) {
ev->setAccepted(workbench()->handleClose());
if (ev->isAccepted() && qDesigner->mainWindow() == this)
QMetaObject::invokeMethod(qDesigner, "quit", Qt::QueuedConnection); // We're going down!
} else {
QMainWindow::closeEvent(ev);
}
}
P.S.: плохо то, что если сделать show окну, то оно появляется на мгновение, а потом идет выход из программы.
Автор: LE0N 13.3.2009, 0:38
Цитата(SABROG @ 13.3.2009, 2:20)
Я вот чего понять не могу. Если класс с проверкой настроек спецом вынесен отдельно от класса главного окна, чтобы ускорить загрузку программы и программа не делала лишних телодвижений по инициализации элементов управления, перевода текста и т.д. То нафига eventloop (.exec()) ? Тут либо возвращать true/false из метода и делать return из main'a, если далеко возвращаться, то exit(). Как так он может не работать?
У меня класс настроек системы не вынесен ЗА программу.
Вообще, по задуме, у меня имеется окно Loader в котором есть прогресс бар и прочая байда. Работаю с удалённой базой данных Mysql.
Сначала получаю настройки, потом пользователей. И прочую нужную мне в работе байду. Лоадер всё это отображает и весь процесс виден в этом самом окне. Когда загружаю всё, что мне нужно - показываю главное окно...
Вот и вся система...
А на данный момент делал окно, которое при вызове статического метода, показывает окошко с ошибкой. После закрытия которого - закрывается вся программа.
Спасибо BRE, показал способ, как это сделать. Теперь QApplication::exit работает...
Блин...Дайте мне возможность редактировать
Вот сейчас после пива пришёл, и вместо quote, code написал сгоряча))
Автор: Litkevich Yuriy 13.3.2009, 15:21
Цитата(LE0N @ 13.3.2009, 3:38)
Блин...Дайте мне возможность редактировать
Вот сейчас после пива пришёл, и вместо quote, code написал сгоряча))
по набору 20 сообщений автоматом появится
А для цитирования есть отдельная кнопка, см. http://www.forum.crossplatform.ru/index.php?showtopic=1455&view=findpost&p=16534, тогда и в рукопашную набирать ненадо
Автор: LE0N 13.3.2009, 15:39
Да я знаю, что есть. Иногда мне проще вручную набрать ))
Автор: AlexRass 16.3.2009, 19:34
Добавь свой сигнал и эмитируй где тебе надо. Соедини его со слотом close(). Должно работать.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)