2010-07-26 21 views
14

मैं क्यूटी में "ट्रे को कम करने" फ़ंक्शन को सही तरीके से कैसे कार्यान्वित करूं?मैं क्यूटी में "ट्रे को कम करने" फ़ंक्शन को सही तरीके से कैसे कार्यान्वित करूं?

मैंने QMainWindow::changeEvent(QEvent *e) के अंदर निम्न कोड को आजमाया, लेकिन विंडो बस टास्कबार में कम हो जाती है और ग्राहक क्षेत्र पुनर्स्थापित होने पर खाली सफेद दिखाई देता है।

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

घटना को अनदेखा करने का प्रयास कुछ भी नहीं लगता है, या तो।

+1

व्यक्तिगत अनुभव से मैंने सीखा है कि आप आमतौर पर यह नहीं चाहता। ट्रे कम से कम अनुप्रयोगों के लिए जगह नहीं है। ट्रे _is_ एप्लेट्स के लिए सही जगह है जो ईवेंट (ब्लूटूथ, नेटवर्क स्थिति, उस तरह की चीजें) के लिए देखती है। यदि आपके एप्लिकेशन में उस तरह की कार्यक्षमता है, तो उस भाग को अपनी प्रक्रिया में विभाजित करना बुद्धिमान हो सकता है। यह सहायक प्रक्रिया हमेशा ट्रे में दिखाई देगी, और कहीं और नहीं। – MSalters

+3

हालांकि कुछ उपयोगकर्ता इस कार्यक्षमता को पसंद करते हैं। मेरे आवेदन में, यह डिफ़ॉल्ट व्यवहार नहीं है, लेकिन प्राथमिकता संवाद में एक विकल्प के रूप में प्रस्तुत किया जाता है। मुझे लगता है कि इस तरह के संतुलन सही डिजाइन और उपयोगकर्ता वरीयता संतुलन। –

उत्तर

17

स्पष्ट रूप से अन्य घटनाओं को संसाधित करने के लिए एक छोटी देरी की आवश्यकता है (शायद कोई सटीक विवरण पोस्ट करेगा?)। यहाँ है कि मैं क्या जो पूरी तरह से काम करता है कर समाप्त हो गया, बताया गया है:

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

दिलचस्प तथ्य यह है कि इसे काम करने में देरी की आवश्यकता है, लेकिन बहुत उपयोगी :) हालांकि जानना चाहूंगा कि" क्लीनर "समाधान है या नहीं .. लेकिन मैं भी आपका कोड आज़माउंगा :) – Exa

+0

हाय मैं कोशिश कर रहा हूं और त्रुटि "प्राथमिकताएं" घोषित नहीं की गई है? – 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(); 
    } 
} 

इस तरह मैं "ट्रे को कम करने" का एहसास करता हूं। अब आप आइकन पर डबल क्लिक करके, या राइट-क्लिक करके और मेनू में "दिखाएँ/छुपाएं" चुनकर कम कर सकते हैं।

+0

धन्यवाद, लेकिन मैं विशेष रूप से खिड़की को छिपाने का एक तरीका ढूंढ रहा हूं जब उपयोगकर्ता इसे कम करता है। ;) –

+0

आह ठीक है, क्षमा करें, आपको वहां गलत मिला :) तो अब यह उन लोगों के लिए एक उदाहरण है जिन्हें शो/छुपा-फ़ंक्शंस के साथ एक कार्यरत आइकन की आवश्यकता है :) – Exa

+0

+1 एक अच्छे कोड के लिए! कोड के एक अच्छे टुकड़े के लिए – Narek

11

क्या जेक Petroules कहा के अलावा, ऐसा लगता है कि बस कर रही:

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

पर्याप्त है। http://qt-project.org/doc/qt-4.8/qtimer.html#details से:

एक विशेष मामले के रूप में, 0 का समय समाप्त होते ही खिड़की प्रणाली की घटना कतार में सभी घटनाओं संसाधित किया गया है बाहर समय समाप्त हो जाएगा के साथ एक QTimer

इस तरह आप एक उपयुक्त देरी मूल्य का चयन करने की समस्या नहीं है ...

संबंधित मुद्दे

 संबंधित मुद्दे