2010-07-26 6 views
14

Comment implémenter correctement une fonction "réduire au plateau" dans Qt?Comment implémenter correctement une fonction "réduire au plateau" dans Qt?

J'ai essayé le code suivant à l'intérieur de QMainWindow::changeEvent(QEvent *e), mais la fenêtre se réduit simplement à la barre des tâches et la zone cliente apparaît blanche en blanc lorsqu'elle est restaurée.

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

Tenter d'ignorer l'événement ne semble pas non plus faire quoi que ce soit.

+1

De son expérience personnelle que j'ai appris que vous ne voulez pas l'habitude de cela. Le bac n'est pas l'endroit pour les applications minimisées. Le plateau est l'endroit approprié pour les applets qui surveillent les événements (Bluetooth, état du réseau, ce genre de choses). Si votre application contient ce genre de fonctionnalité, il peut être judicieux de séparer cette partie dans son propre processus. Ce processus d'assistance apparaîtra alors toujours dans le bac, et nulle part ailleurs. – MSalters

+3

Certains utilisateurs apprécient cette fonctionnalité. Dans mon application, ce n'est pas le comportement par défaut, mais il est présenté comme une option dans la boîte de dialogue des préférences. Je pense que ce genre de soldes corrige la conception et la préférence de l'utilisateur. –

Répondre

17

Apparemment, un petit délai est nécessaire pour traiter d'autres événements (peut-être que quelqu'un publiera les détails exacts?). Voici ce que je fini par faire, qui fonctionne parfaitement:

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

Fait intéressant qu'il nécessite un délai de travail, mais très utile :) Voudrais savoir s'il existe une solution" plus propre "mais .. Mais je vais aussi essayer votre code :) – Exa

+0

Salut im essayant ceci et obtenant l'erreur "Préférences" n'a pas été déclarée? – 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(); 
    } 
} 

C'est ainsi que je réalise un "réduire au plateau". Vous pouvez maintenant minimiser soit en double-cliquant sur l'icône, soit en faisant un clic droit et en sélectionnant "Afficher/Masquer" dans le menu.

+0

Merci, mais je cherche spécifiquement un moyen de cacher la fenêtre lorsque l'utilisateur la minimise. ;) –

+0

Ah d'accord, désolé, vous vous êtes trompé là-bas :) Alors maintenant, c'est juste un exemple pour ceux qui ont besoin d'une icône de travail avec afficher/masquer les fonctions :) – Exa

+0

+1 pour un code sympa! – Narek

11

En plus de ce que dit Jake Petroules, il semble que le simple fait:

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

est suffisant. De http://qt-project.org/doc/qt-4.8/qtimer.html#details:

En cas particulier, un QTimer avec un délai d'attente de 0 va chronométrer dès que tous les événements dans la file d'attente d'événements du système de fenêtre ont été traitées.

De cette façon, vous n'avez pas le problème de la sélection d'une valeur de retard appropriée ...

Questions connexes