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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Внезапное закрытие свернутого окна после появления любого диалога  (Прочитано 3568 раз)
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();
}
}

У кого-нибудь есть идеи?
Записан
BRE
Гость
« Ответ #1 : Октябрь 06, 2009, 19:34 »

У кого-нибудь есть идеи?
Конечно есть.  Подмигивающий
Посмотри на:
void QApplication::setQuitOnLastWindowClosed ( bool quit )
Записан
BRE
Гость
« Ответ #2 : Октябрь 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);
}
Не лучшее решение с подключением экшинов.  Улыбающийся
Записан
proton
Гость
« Ответ #3 : Октябрь 06, 2009, 19:50 »

Не лучшее решение с подключением экшинов.  Улыбающийся
Есть более красивый вариант?
Записан
Rcus
Гость
« Ответ #4 : Октябрь 06, 2009, 19:55 »

у QMenu метод есть несколько перегрузок метода addAction, можно выбрать те, что сразу соединяют действие со слотом.
Записан
proton
Гость
« Ответ #5 : Октябрь 06, 2009, 19:59 »

У кого-нибудь есть идеи?
Конечно есть.  Подмигивающий
Посмотри на:
void QApplication::setQuitOnLastWindowClosed ( bool quit )
Огромное спасибо, тему можно закрывать!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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