जैसा कि @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
विधि होस्ट करने के लिए सबसे अच्छी जगह नहीं है।वास्तविक कोड में आप या तो:
QAction
विगेट्स घटना को छानने के लिए समर्पित QObject
उपवर्ग (ते) बनायें।
- सबक्लास
QAction
और इसे eventFilter
विधि ओवरराइड करें। इस मामले में आप के परिणाम को QAction
सबक्लास ऑब्जेक्ट में सहेज सकते हैं और बाद में इसे triggered()
सिग्नल हैंडलर में उपयोग कर सकते हैं। एक मामूली असुविधा है कि क्यूटी निर्माता (कम से कम v3.2.1 तक) आपको QAction
एस को इसके फ़ॉर्म डिज़ाइनर में "प्रचारित" करने की अनुमति नहीं देता है, इसलिए आपको विंडो कन्स्ट्रक्टर में मैन्युअल रूप से मेनू में क्रियाएं जोड़ने की आवश्यकता होगी।
- सबक्लास
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
का उपयोग करते हैं।
क्या मैं कक्षा में ईवेंटफिल्टर कर सकता हूं जिसे मैं QAction के रूप में उपयोग करता हूं? मेरे पास पहले से ही कक्षा है जो QAction से विरासत में है, और मैं इसे अपने आवेदन में उपयोग करता हूं। मैंने ईवेंटफिल्टर विधि को ओवरराइड किया, लेकिन कुछ भी नहीं हो रहा है। क्या मुझे इसे कहीं स्थापित करना है? –
@ एसएलस निश्चित रूप से आप कर सकते हैं। मैंने अपने उत्तर से मामले 2 के लिए स्पष्टीकरण जोड़ा जो आपके कोड को काम करना चाहिए। यह सुनिश्चित करने के लिए कि यह ठीक से काम करता है, अपने 'eventFilter' विधि से' qDebug() 'पर कुछ प्रिंट करने का प्रयास करें। – Sergey
क्या यह काम करेगा जब मैं इसे 'QSystemTrayIcon' पर उपयोग करना चाहता हूं? मेरे आवेदन में GUI नहीं है, 'QSystemTrayIcon' में केवल' QActions' 'है। –