2010-07-26 11 views
14

Come implementare correttamente una funzione "minimizza al vassoio" in Qt?Come implementare correttamente una funzione "minimizza al vassoio" in Qt?

Ho provato il seguente codice all'interno di QMainWindow::changeEvent(QEvent *e), ma la finestra si riduce semplicemente alla barra delle applicazioni e l'area client appare bianca vuota quando viene ripristinata.

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

Anche il tentativo di ignorare l'evento non sembra fare nulla.

+1

Per esperienza personale ho imparato che di solito non si vuole questo. Il vassoio non è il posto ideale per applicazioni ridotte al minimo. Il vassoio _è_ il posto giusto per le applet che guardano gli eventi (Bluetooth, stato della rete, quel genere di cose). Se la tua applicazione contiene quel tipo di funzionalità, potrebbe essere saggio dividere quella parte nel suo stesso processo. Questo processo di aiuto apparirà quindi sempre nel vassoio, e da nessun'altra parte. – MSalters

+3

Alcuni utenti preferiscono questa funzionalità. Nella mia applicazione, non è il comportamento predefinito, ma viene presentato come un'opzione nella finestra di dialogo delle preferenze. Immagino che quel tipo di equilibri corregga il design e le preferenze dell'utente. –

risposta

17

Apparentemente è necessario un piccolo ritardo per elaborare altri eventi (forse qualcuno pubblicherà i dettagli esatti?). Ecco quello che ho finito per fare, che funziona perfettamente:

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

Fatto interessante che richiede un ritardo per il lavoro, ma molto utile :) Vorrei sapere se c'è una soluzione" più pulita "però .. Ma proverò anche il codice :) – Exa

+0

Ciao sto provando questo e ricevendo errore "Preferenze" non è stato dichiarato? – 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(); 
    } 
} 

Ecco come realizzo un "minimizzare al vassoio". Ora puoi ridurre a icona facendo doppio clic sull'icona o facendo clic con il pulsante destro del mouse e selezionando "Mostra/nascondi" nel menu.

+0

Grazie, ma sto cercando in particolare un modo per nascondere la finestra quando l'utente la minimizza. ;) –

+0

Ah okay, scusa, ti ho sbagliato lì :) Quindi ora è solo un esempio per coloro che hanno bisogno di un'icona funzionante con funzioni show/hide :) – Exa

+0

+1 per un bel codice! – Narek

11

In aggiunta a quanto detto Jake Petroules, sembra che semplicemente facendo:

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

è sufficiente. Da http://qt-project.org/doc/qt-4.8/qtimer.html#details:

Come caso speciale, un QTimer con un timeout di 0 sarà timeout non appena tutti gli eventi in coda di eventi del sistema a finestre sono stati elaborati.

In questo modo non si ha il problema di selezione di un valore di ritardo appropriato ...

Problemi correlati