2010-07-26 8 views
14

¿Cómo implemento correctamente una función de "minimizar a la bandeja" en Qt?¿Cómo implemento correctamente una función de "minimizar a la bandeja" en Qt?

Probé el siguiente código dentro de QMainWindow::changeEvent(QEvent *e), pero la ventana simplemente se minimiza en la barra de tareas y el área del cliente aparece en blanco cuando se restaura.

if (Preferences::instance().minimizeToTray()) 
{ 
    e->ignore(); 
    this->setVisible(false); 
} 

Intentar ignorar el evento tampoco parece hacer nada.

+1

Por experiencia personal he aprendido que por lo general no quiere esto. La bandeja no es el lugar para aplicaciones minimizadas. La bandeja es el lugar correcto para los applets que miran eventos (Bluetooth, estado de la red, ese tipo de cosas). Si su aplicación contiene ese tipo de funcionalidad, puede ser aconsejable dividir esa parte en su propio proceso. Este proceso de ayuda aparecerá siempre en la bandeja y en ningún otro lugar. – MSalters

+3

Sin embargo, algunos usuarios les gusta esta funcionalidad. En mi aplicación, no es el comportamiento predeterminado, pero se presenta como una opción en el cuadro de diálogo de preferencias. Me imagino que ese tipo de equilibrio equilibra el diseño y la preferencia del usuario. –

Respuesta

17

Aparentemente, se necesita un pequeño retraso para procesar otros eventos (¿quizás alguien publicará los detalles exactos?). Esto es lo que terminé haciendo, que funciona a la perfección:

void MainWindow::changeEvent(QEvent* e) 
{ 
    switch (e->type()) 
    { 
     case QEvent::LanguageChange: 
      this->ui->retranslateUi(this); 
      break; 
     case QEvent::WindowStateChange: 
      { 
       if (this->windowState() & Qt::WindowMinimized) 
       { 
        if (Preferences::instance().minimizeToTray()) 
        { 
         QTimer::singleShot(250, this, SLOT(hide())); 
        } 
       } 

       break; 
      } 
     default: 
      break; 
    } 

    QMainWindow::changeEvent(e); 
} 
+0

Dato curioso que requiere un retraso para el trabajo, pero es muy útil :) Me gustaría saber si hay una solución" limpia ". Pero intentaré tu código también :) – Exa

+0

Hola, estoy intentando esto y obtengo el error "Preferencias" no ha sido declarado? – GeneCode

7
void main_window::create_tray_icon() 
{ 
    m_tray_icon = new QSystemTrayIcon(QIcon(":/icon.png"), this); 

    connect(m_tray_icon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(on_show_hide(QSystemTrayIcon::ActivationReason))); 

    QAction *quit_action = new QAction("Exit", m_tray_icon); 
    connect(quit_action, SIGNAL(triggered()), this, SLOT(on_exit())); 

    QAction *hide_action = new QAction("Show/Hide", m_tray_icon); 
    connect(hide_action, SIGNAL(triggered()), this, SLOT(on_show_hide())); 

    QMenu *tray_icon_menu = new QMenu; 
    tray_icon_menu->addAction(hide_action); 
    tray_icon_menu->addAction(quit_action); 

    m_tray_icon->setContextMenu(tray_icon_menu); 

    m_tray_icon->show(); 
    } 

void main_window::on_show_hide(QSystemTrayIcon::ActivationReason reason) 
{ 
    if(reason) 
    { 
     if(reason != QSystemTrayIcon::DoubleClick) 
     return; 
    } 

    if(isVisible()) 
    { 
     hide(); 
    } 
    else 
    { 
     show(); 
     raise(); 
     setFocus(); 
    } 
} 

Así es como me doy cuenta de un "minimizar a la bandeja". Ahora puede minimizar haciendo doble clic en el icono, o haciendo clic con el botón derecho y seleccionando "Mostrar/Ocultar" en el menú.

+0

Gracias, pero específicamente estoy buscando una forma de ocultar la ventana cuando el usuario la minimiza. ;) –

+0

Ah bien, lo siento, te equivoqué :) Así que ahora es solo un ejemplo para aquellos que necesitan un ícono que funcione con show/hide-functions :) – Exa

+0

+1 para un buen código! – Narek

11

Además de lo que dijo Jake Petroules, parece que simplemente haciendo:

QTimer::singleShot(0, this, SLOT(hide())); 

es suficiente. De http://qt-project.org/doc/qt-4.8/qtimer.html#details:

Como caso especial, un QTimer con un tiempo de espera de 0 será el tiempo de espera tan pronto como todos los eventos en la cola de eventos del sistema de ventanas han sido procesados.

De esta manera usted no tiene el problema de seleccionar un valor de retardo apropiado ...

Cuestiones relacionadas