Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: proton от Октябрь 06, 2009, 19:28



Название: Внезапное закрытие свернутого окна после появления любого диалога
Отправлено: 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 )
Огромное спасибо, тему можно закрывать!