2010-07-26 11 views
14

Jak prawidłowo zaimplementować funkcję "minimalizuj do zasobnika" w Qt?Jak prawidłowo zaimplementować funkcję "minimize to tray" w Qt?

Próbowałem następujący kod wewnątrz QMainWindow::changeEvent(QEvent *e), ale okno po prostu minimalizuje do paska zadań i obszar klienta wydaje się pusty biały po przywróceniu.

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

Próba zignorowania zdarzenia nie wydaje się również nic.

+1

Z własnego doświadczenia nauczyłem się, że zwykle nie chcą tego. Taca nie jest miejscem dla zminimalizowanych aplikacji. Taca jest właściwym miejscem dla apletów, które oglądają zdarzenia (Bluetooth, stan sieci, tego rodzaju rzeczy). Jeśli twoja aplikacja zawiera tego rodzaju funkcjonalność, rozsądne może być rozdzielenie tej części w swoim procesie. Ten proces pomocniczy pojawi się zawsze w zasobniku i nigdzie indziej. – MSalters

+3

Niektórzy użytkownicy lubią tę funkcję. W mojej aplikacji nie jest to zachowanie domyślne, ale jest prezentowane jako opcja w oknie preferencji. Sądzę, że tego rodzaju salda jest poprawnym projektem i preferencjami użytkownika. –

Odpowiedz

17

Najwyraźniej małe opóźnienie jest potrzebne do przetworzenia innych zdarzeń (być może ktoś opublikuje dokładne dane?). Oto, co skończyło się robi, który działa perfekcyjnie:

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

Interesujący fakt, że wymaga to opóźnienia w pracy, ale bardzo przydatny :) Chciałbym się jednak dowiedzieć, czy istnieje" czystsze "rozwiązanie. Ale spróbuję też twojego kodu :) – Exa

+0

Cześć im próbowanie tego i uzyskanie błędu "Preferencje" nie została zadeklarowana? – 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(); 
    } 
} 

Tak właśnie rozumiem "zminimalizować do zasobnika". Możesz teraz zminimalizować, klikając dwukrotnie ikonę lub klikając prawym przyciskiem myszy i wybierając "Pokaż/ukryj" w menu.

+0

Dzięki, ale szczególnie szukam sposobu na ukrycie okna, gdy użytkownik go zminimalizuje. ;) –

+0

Ah w porządku, przepraszam, źle cię tam zrobiłem :) Teraz jest to tylko przykład dla tych, którzy potrzebują działającej ikony z funkcjami show/hide :) – Exa

+0

+1 za fajny kod! – Narek

11

Oprócz tego, co Jake Petroules powiedział, wydaje się, że po prostu robi:

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

wystarczy. Od http://qt-project.org/doc/qt-4.8/qtimer.html#details:

jako szczególny przypadek, w QTimer z limitem czasu 0 będzie czas, jak tylko wszystkie zdarzenia w kolejce zdarzeń systemu okienkowego zostały przetworzone.

W ten sposób nie ma problemu wybierając odpowiednią wartość opóźnienia ...

Powiązane problemy