Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: spectre71 от Сентябрь 04, 2009, 09:38



Название: Minimize System Tray
Отправлено: spectre71 от Сентябрь 04, 2009, 09:38
Кто-нибудь знает как сделать минимизацию приложения в System Tray и восстановление его обратно?
1) Через QSystemTrayIcon создаем иконку в System Tray, с этим все просто
2) При нажатии кнопки "Minimize" на "Title Bar", окно программы должно минимизироваться и должна исчезнуть кнопка для приложения из панели задач.
3) При щелчке на иконке в System Tray состояние окна должно быть восстановлено и оно должно быть переведено на передний план(на передний план окно переводиться и в случае когда оно не минимизировано)
4) Необходима адекватная работа под Windows, Mac и Linux


Название: Re: Minimize System Tray
Отправлено: BaltikS от Сентябрь 04, 2009, 10:22
Могу только посоветовать поймать событие WindowStateChange и проверить WindowState == Qt::WindowMinimized далее сделать hide(). А дальше как в примере про SystemTray...


Название: Re: Minimize System Tray
Отправлено: BaltikS от Сентябрь 04, 2009, 10:46
Доработал пример с треем. Добавляем новый эвент в форму...
Код:
void Window::changeEvent ( QEvent * event )
{
if (event->type() == QEvent::WindowStateChange)
{
if (windowState() == Qt::WindowMinimized)
qApp->postEvent(this, new QCloseEvent());
}
}
Также для проверки был изменён тип окна с QDialog на QWidget...  . В винде проверялось - работает.


Название: Re: Minimize System Tray
Отправлено: spectre71 от Сентябрь 05, 2009, 08:46
Могу только посоветовать поймать событие WindowStateChange и проверить WindowState == Qt::WindowMinimized далее сделать hide(). А дальше как в примере про SystemTray...
К сожалению под Lunix - hide() не помогает, кнопка из панели задач не исчезает!


Название: Re: Minimize System Tray
Отправлено: BlackTass от Сентябрь 05, 2009, 08:57
Да, с линуксом есть проблемы в этом плане (насколько мне известно проявляется только в кедах, на гноме когда проверяли все аккуратно сворачивалось в трей).


Название: Re: Minimize System Tray
Отправлено: Rcus от Сентябрь 05, 2009, 09:13
Хм, странно... посмотрел KDE приложения - нормально они в трей сворачиваются: все сводится к переопределению closeEvent и вызовам hide(); e->ignore();
UPD: хм, сначала подумал что что-то я не то сказал, но все же это работает и с QEvent::WindowStateChange


Название: Re: Minimize System Tray
Отправлено: spectre71 от Сентябрь 05, 2009, 09:26
Хм, странно... посмотрел KDE приложения - нормально они в трей сворачиваются: все сводится к переопределению closeEvent и вызовам hide(); e->ignore();

Под Windows и Mac - работает.
Под "CentOs"/"Gnome" - из панели задач не исчезает.
Под KDE - не проверял

Код
C++ (Qt)
void sb_pipeline2::changeEvent(QEvent * event) {
 if(event->type() == QEvent::ActivationChange) {    
   if(isVisible() && isMinimized()) {
     event->ignore();
     hide();
     return;
   }
 }
 QMainWindow::changeEvent(event);
}


Название: Re: Minimize System Tray
Отправлено: BlackTass от Сентябрь 05, 2009, 19:10
Код:
void MainWindow::changeEvent (QEvent *event)
{
    if ((event->type() == QEvent::WindowStateChange) &&
        isMinimized() &&
        systemTrayIcon->isVisible() &&)
    {
        QTimer::singleShot(0, this, SLOT(hide()));
        event->ignore();
    }
    else
        QMainWindow::changeEvent(event);
}

Это работает под виндой, под гномом (сам не проверял правда, но заказчик утверждает что у него работает), а под кедами все равно остается при минимизации в таскбаре.