2010-07-26 2 views
14

Wie kann ich die Funktion "Minimieren in Fach" in Qt ordnungsgemäß implementieren?Wie implementiere ich richtig eine "minimize to tray" -Funktion in Qt?

Ich habe versucht, den folgenden Code innerhalb QMainWindow::changeEvent(QEvent *e), aber das Fenster minimiert einfach auf die Taskleiste und der Client-Bereich erscheint leere weiße wenn wiederhergestellt.

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

Der Versuch, das Ereignis zu ignorieren, scheint auch nichts zu bewirken.

+1

Aus persönlicher Erfahrung habe ich gelernt, dass man in der Regel das nicht wollen. Das Fach ist nicht der Ort für minimierte Anwendungen. Das Tray ist der richtige Ort für Applets, die nach Ereignissen suchen (Bluetooth, Netzwerkstatus, diese Art von Zeugs). Wenn Ihre Anwendung diese Art von Funktionalität enthält, kann es sinnvoll sein, diesen Teil in einem eigenen Prozess zu trennen. Dieser Hilfsprozess erscheint dann immer im Tray und nirgendwo sonst. – MSalters

+3

Einige Benutzer mögen diese Funktionalität jedoch. In meiner Anwendung ist es nicht das Standardverhalten, sondern wird als eine Option im Einstellungsdialog angezeigt. Ich denke, dass diese Art von Waagen korrektes Design und Benutzerpräferenz korrigieren. –

Antwort

17

Anscheinend ist eine kleine Verzögerung erforderlich, um andere Ereignisse zu verarbeiten (vielleicht wird jemand die genauen Details veröffentlichen?). Hier ist, was ich am Ende tun, die perfekt funktioniert:

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

Interessante Tatsache, dass es eine Verzögerung benötigt, um zu arbeiten, aber sehr nützlich :) Würde gerne wissen, ob es eine" sauberere "Lösung obwohl .. Aber ich werde Ihren Code auch versuchen :) – Exa

+0

Hi ich versuche das und bekomme Fehler "Einstellungen" wurde nicht deklariert? – 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(); 
    } 
} 

So realisiere ich ein "minimize to tray". Sie können nun minimieren, indem Sie entweder auf das Symbol doppelklicken oder indem Sie mit der rechten Maustaste klicken und im Menü "Einblenden/Ausblenden" auswählen.

+0

Danke, aber ich suche speziell nach einer Möglichkeit, das Fenster zu verstecken, wenn der Benutzer es minimiert. ;) –

+0

Ah okay, sorry, hab dich da falsch verstanden :) So, jetzt ist es nur ein Beispiel für diejenigen, die ein funktionierendes Icon mit show/hide-Funktionen brauchen :) – Exa

+0

+1 für einen netten Code! – Narek

11

Zusätzlich zu dem, was Jake Petroules sagte, scheint es, dass einfach tun:

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

genug ist. Von http://qt-project.org/doc/qt-4.8/qtimer.html#details:

Als Sonderfall, eine QTimer mit einem Timeout von 0 sobald alle Ereignisse im Fenster-System-Ereigniswarteschlange verarbeitet wurden Timeout.

diese Weise können Sie das Problem nicht eine entsprechende Verzögerungswert der Auswahl haben ...