Название: Внезапное закрытие свернутого окна после появления любого диалога
Отправлено: proton от Октябрь 06, 2009, 19:28
Проясняю непонятный заголовок =) Есть простейшая программка, умеющая сворачиваться в трей. Вот класс главного окна: C++ (Qt) class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; QSystemTrayIcon tray; QMenu cmenu; public slots: void aboutDialog(); void prefDialog(); };
Вот конструктор: C++ (Qt) MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), CurrentIndex(-1) { ui->setupUi(this); // cmenu.addAction(tr("Show")); cmenu.addAction(tr("Hide")); cmenu.addSeparator(); cmenu.addAction(tr("Preferences")); cmenu.addAction(tr("About")); cmenu.addSeparator(); cmenu.addAction(qApp->style()->standardIcon(QStyle::SP_TitleBarCloseButton), tr("Quit")); connect(cmenu.actions()[0], SIGNAL(triggered()), this, SLOT(show())); connect(cmenu.actions()[1], SIGNAL(triggered()), this, SLOT(hide())); connect(cmenu.actions()[3], SIGNAL(triggered()), this, SLOT(prefDialog())); connect(cmenu.actions()[4], SIGNAL(triggered()), this, SLOT(aboutDialog())); connect(cmenu.actions()[6], SIGNAL(triggered()), qApp, SLOT(quit())); cmenu.actions()[6]->setShortcut(QKeySequence::Close); tray.setIcon(qApp->style()->standardIcon(QStyle::SP_FileIcon)); tray.setContextMenu(&cmenu); connect(&tray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(trayActivated(QSystemTrayIcon::ActivationReason))); tray.show(); }
Собственно проблема: Если приложение свернуть в трей, а затем запустить любой диалог (из контекстного меню трея), то после закрытия сего диалога приложение завершается. Причем корректно, без ошибок. Диалоги вызываются так: C++ (Qt) void MainWindow::aboutDialog() { QMessageBox::information(this, tr("123"), tr("456")); }
C++ (Qt) void MainWindow::prefDialog() { configDialog dlg; dlg.exec(); }
Пока фиксится небольшим костылем в виде: C++ (Qt) void MainWindow::aboutDialog() { QMessageBox::information(this, tr("123"), tr("456")); if(isHidden()) { show(); hide(); } }
У кого-нибудь есть идеи?
Название: Re: Внезапное закрытие свернутого окна после появления любого диалога
Отправлено: BRE от Октябрь 06, 2009, 19:34
У кого-нибудь есть идеи?
Конечно есть. ;) Посмотри на: void QApplication::setQuitOnLastWindowClosed ( bool quit )
Название: Re: Внезапное закрытие свернутого окна после появления любого диалога
Отправлено: BRE от Октябрь 06, 2009, 19:42
C++ (Qt) connect(cmenu.actions()[0], SIGNAL(triggered()), this, SLOT(show())); connect(cmenu.actions()[1], SIGNAL(triggered()), this, SLOT(hide())); connect(cmenu.actions()[3], SIGNAL(triggered()), this, SLOT(prefDialog())); connect(cmenu.actions()[4], SIGNAL(triggered()), this, SLOT(aboutDialog())); connect(cmenu.actions()[6], SIGNAL(triggered()), qApp, SLOT(quit())); cmenu.actions()[6]->setShortcut(QKeySequence::Close); }
Не лучшее решение с подключением экшинов. :)
Название: Re: Внезапное закрытие свернутого окна после появления любого диалога
Отправлено: proton от Октябрь 06, 2009, 19:50
Не лучшее решение с подключением экшинов. :)
Есть более красивый вариант?
Название: Re: Внезапное закрытие свернутого окна после появления любого диалога
Отправлено: Rcus от Октябрь 06, 2009, 19:55
у QMenu метод есть несколько перегрузок метода addAction, можно выбрать те, что сразу соединяют действие со слотом.
Название: Re: Внезапное закрытие свернутого окна после появления любого диалога
Отправлено: proton от Октябрь 06, 2009, 19:59
У кого-нибудь есть идеи?
Конечно есть. ;) Посмотри на: void QApplication::setQuitOnLastWindowClosed ( bool quit ) Огромное спасибо, тему можно закрывать!
|