2016-08-06 7 views
7

द्वारा क्लिक किया गया है, मेरे पास QMenu में QAction है। जब QActiontriggered() है तो मैं जानना चाहता हूं कि यह कौन सा बटन करता है।मैं जानना चाहता हूं कि क्यूएक्शन को बाएं या दाएं माउस बटन

connect(YourAction, SIGNAL(triggered()), this, SLOT(actionclicked())); 

void MainWindow::actionclicked(QMouseEvent *e) 
{ 
    if (e->buttons() == Qt::RightButton) 
} 

मैं क्योंकि triggered() इस तरह के तर्क नहीं है कुछ इस तरह नहीं कर सकते।

उत्तर

4

जैसा कि @mvidelgauz ने देखा, QAction इनपुट उपकरणों से सारित है जो कार्रवाई को ट्रिगर कर सकता है। फिर भी, यदि आपके जीयूआई में कार्रवाई का उपयोग किया जाता है, तो इसमें एक या अधिक संबंधित विजेट हैं: टूलबार में टूल बटन, मेनू बार में प्रविष्टियां आदि। ये विजेट किसी अन्य विजेट की तरह कार्य करते हैं, इसलिए उन्हें ऐसी घटनाएं मिलती हैं जिन्हें installEventFilter और eventFilter के उपयोग से फ़िल्टर किया जा सकता है। इन दो विधियों को QObject से विरासत में मिला है, इसलिए वे लगभग किसी भी क्यूटी कक्षा में मौजूद हैं। उदाहरण के लिए, चलिए QMainWindow और QAction के साथ एक एप्लिकेशन बनाएं जिसे actionTest कहा जाता है। तब की मुख्य विंडो के eventFilter विधि अधिभावी द्वारा actionTest के संबद्ध विगेट्स के लिए एक कार्य फिल्टर में मुख्य विंडो में ही गौर करें:

bool eventFilter(QObject *obj, QEvent *ev) { 
    //Catch only mouse press events. 
    if(ev->type() == QEvent::MouseButtonPress) { 
     // Cast general event to mouse event. 
     QMouseEvent *mev = static_cast<QMouseEvent*>(ev); 
     // Show which button was clicked. 
     if(mev->button() == Qt::LeftButton) { 
      qDebug() << "Left button!"; 
     } 
     if(mev->button() == Qt::RightButton) { 
      qDebug() << "Right button!"; 
     } 
    } 
    // In this example we just showed the clicked button. Pass the event 
    // for further processing to make QAction slots work. 
    return QMainWindow::eventFilter(obj, ev); 
} 

तो हम सब देख चुके वस्तुओं, जो हमारे मामले में विगेट्स हैं के लिए घटना फिल्टर वस्तु स्थापित करने की आवश्यकता । यह मुख्य विंडो निर्माता में करते हैं:

MainWindow::MainWindow(QWidget *parent) : 
QMainWindow(parent), 
ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    for(auto wgtPtr : ui->actionTest->associatedWidgets()) { 
     wgtPtr->installEventFilter(this); 
    } 
} 

अंत में, triggered() संकेत से निपटने के लिए एक स्लॉट जोड़ें:

void on_actionTest_triggered() { 
    qDebug() << "Action triggered!"; 
} 

अब अगर आप बाईं माउस बटन के साथ कार्रवाई मेनू प्रविष्टि क्लिक करें, यह

प्रिंट होगा
Left button! 
Action triggered! 

जबकि सही माउस बटन के लिए परिणाम होगा

Right button! 
Action triggered! 

ध्यान दें कि विजेट ईवेंट फ़िल्टरिंग हमेशा triggered() सिग्नल उत्सर्जन से पहले की जाती है।

उपर्युक्त कोड केवल एक उदाहरण है, और MainWindow कक्षा eventFilter विधि होस्ट करने के लिए सबसे अच्छी जगह नहीं है।वास्तविक कोड में आप या तो:

  1. QAction विगेट्स घटना को छानने के लिए समर्पित QObject उपवर्ग (ते) बनायें।
  2. सबक्लास QAction और इसे eventFilter विधि ओवरराइड करें। इस मामले में आप के परिणाम को QAction सबक्लास ऑब्जेक्ट में सहेज सकते हैं और बाद में इसे triggered() सिग्नल हैंडलर में उपयोग कर सकते हैं। एक मामूली असुविधा है कि क्यूटी निर्माता (कम से कम v3.2.1 तक) आपको QAction एस को इसके फ़ॉर्म डिज़ाइनर में "प्रचारित" करने की अनुमति नहीं देता है, इसलिए आपको विंडो कन्स्ट्रक्टर में मैन्युअल रूप से मेनू में क्रियाएं जोड़ने की आवश्यकता होगी।
  3. सबक्लास QMenu, QToolBar, आदि .., और उन्हें एक्शन फ़िल्टर बनाते हैं? मुझे नहीं पता कि यह दो पूर्व प्रकारों से बेहतर कैसे हो सकता है।

क्यूटी घटना प्रणाली के बारे में documentation भी देखें।

चलिए 2 मामले को स्पष्ट करते हैं। मान लें कि QAction से प्राप्त कक्षा को MyAction कहा जाता है। इसे काम करने के लिए आपको MyAction ऑब्जेक्ट्स को अपने लिए फ़िल्टर के रूप में स्थापित करने की आवश्यकता है (उनके विजेट, अधिक विशिष्ट होने के लिए)। विजेट बनाने के बाद आपको इसे करने की ज़रूरत है, इसलिए MyAction कन्स्ट्रक्टर में फ़िल्टर इंस्टॉल करना समयपूर्व हो सकता है और क्रैश हो सकता है। फ़िल्टर स्थापना के लिए बेहतर स्थान एक वर्ग का एक निर्माता है जो MyAction ऑब्जेक्ट का मालिक है। आमतौर पर यह एक विजेट या खिड़की वर्ग है। तो बस

for(auto wgtPtr : ui->myActionObject->associatedWidgets()) { 
    wgtPtr->installEventFilter(ui->myActionObject); 
} 

ui->setupUi(this) कॉल के बाद अपने विंडो कन्स्ट्रक्टर में जोड़ें। यह कोड उपर्युक्त उदाहरण की तरह है, लेकिन हम फ़िल्टर के रूप में this ऑब्जेक्ट के बजाय ui->myActionObject का उपयोग करते हैं।

+0

क्या मैं कक्षा में ईवेंटफिल्टर कर सकता हूं जिसे मैं QAction के रूप में उपयोग करता हूं? मेरे पास पहले से ही कक्षा है जो QAction से विरासत में है, और मैं इसे अपने आवेदन में उपयोग करता हूं। मैंने ईवेंटफिल्टर विधि को ओवरराइड किया, लेकिन कुछ भी नहीं हो रहा है। क्या मुझे इसे कहीं स्थापित करना है? –

+0

@ एसएलस निश्चित रूप से आप कर सकते हैं। मैंने अपने उत्तर से मामले 2 के लिए स्पष्टीकरण जोड़ा जो आपके कोड को काम करना चाहिए। यह सुनिश्चित करने के लिए कि यह ठीक से काम करता है, अपने 'eventFilter' विधि से' qDebug() 'पर कुछ प्रिंट करने का प्रयास करें। – Sergey

+0

क्या यह काम करेगा जब मैं इसे 'QSystemTrayIcon' पर उपयोग करना चाहता हूं? मेरे आवेदन में GUI नहीं है, 'QSystemTrayIcon' में केवल' QActions' 'है। –

3

triggered() क्योंकि यह अपने आप में जरूरी एक माउस घटना का परिणाम नहीं है डिजाइन द्वारा इस तर्क नहीं हो सकता:

जब एक कार्रवाई उपयोगकर्ता द्वारा सक्रिय है यह संकेत उत्सर्जित होता है; उदाहरण के लिए, जब उपयोगकर्ता एक मेनू विकल्प, उपकरण पट्टी बटन क्लिक करता है, या एक कार्रवाई के शॉर्टकट कुंजी संयोजन प्रेस, या जब ट्रिगर() कहा जाता था के लिए

आप माउस की घटनाओं से कनेक्ट करने के लिए यदि आप पैरामीटर के रूप में QMouseEvent की जरूरत की जरूरत है । वास्तव में क्यूटी खुद triggered() उत्सर्जित करता है (लेकिन न केवल मैंने दस्तावेज़ उद्धरण में हाइलाइट किया) फ्रेमवर्क मेनू से माउस ईवेंट प्राप्त करता है। तो ऐसा लगता है कि आपको अपने कोड में एक ही चीज़ करने की आवश्यकता होगी और अपना तर्क जोड़ें।

पीएस This discussion आपके लिए दिलचस्प हो सकता है

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