2010-07-27 15 views
5

मैं क्यूटी QMainWindow में उपयोगकर्ता निष्क्रियता का पता कैसे लगा सकता हूं? मेरा विचार अब तक एक QTimer है जो काउंटर को बढ़ाता है, जो, यदि कोई निश्चित मान पास हो जाता है, तो एप्लिकेशन को लॉक कर देता है। किसी भी माउस या कुंजी इंटरैक्शन को टाइमर को 0 पर वापस सेट करना चाहिए। हालांकि मुझे यह जानने की ज़रूरत है कि रीसेट करने वाले इनपुट ईवेंट को सही ढंग से कैसे प्रबंधित किया जाए; मैं फिर से लागू कर सकते हैं:क्यूटी में उपयोगकर्ता निष्क्रियता का पता लगाने के लिए कैसे?

virtual void keyPressEvent(QKeyEvent *event) 
virtual void keyReleaseEvent(QKeyEvent *event) 
virtual void mouseDoubleClickEvent(QMouseEvent *event) 
virtual void mouseMoveEvent(QMouseEvent *event) 
virtual void mousePressEvent(QMouseEvent *event) 
virtual void mouseReleaseEvent(QMouseEvent *event) 

... लेकिन QMainWindow में सर्व विजेट्स ईवेंट हैंडलर्स QMainWindow के पहुंचने से उन नियंत्रणों में होने वाली घटनाओं को रोकने नहीं होगा? क्या उपयोगकर्ता गतिविधि का पता लगाने के लिए एक बेहतर आर्किटेक्चर है?

उत्तर

7

आप बच्चे के विजेट पर जाने से पहले अपने एप्लिकेशन द्वारा प्राप्त सभी कीबोर्ड और माउस ईवेंट को संसाधित करने के लिए एक कस्टम ईवेंट फ़िल्टर का उपयोग कर सकते हैं।

class MyEventFilter : public QObject 
{ 
    Q_OBJECT 
protected: 
    bool eventFilter(QObject *obj, QEvent *ev) 
    { 
    if(ev->type() == QEvent::KeyPress || 
     ev->type() == QEvent::MouseMove) 
     // now reset your timer, for example 
     resetMyTimer(); 

    return QObject::eventFilter(obj, ev); 
    } 
} 

तब की तरह

MyApplication app(argc, argv); 
MyEventFilter filter; 
app.installEventFilter(&filter); 
app.exec(); 

यह निश्चित रूप से काम करता है कुछ का उपयोग करें (मैं इसे अपने आप की कोशिश की है)।

संपादित करें: और यह संकेत देने के लिए बहुत धन्यवाद कि मेरा पिछला समाधान बहुत उपयोगी नहीं था।

+0

बहुत अच्छा काम करता है, धन्यवाद। मैंने obj पैरामीटर के साथ एक सिग्नल उत्सर्जित कर दिया जहां आपके पास "resetMyTimer" है, और प्रत्येक विंडो सिग्नल को अपने रीसेट टाइमर स्लॉट से संलग्न करती है, जो यह देखने के लिए जांचती है कि * उस * विंडो पर एक विजेट ने घटना उत्पन्न की है ताकि प्रत्येक विंडो स्वतंत्र रूप से ताले हो दूसरों के। –

+0

इवेंट केवल इवेंटफिल्टर() को भेजा जाता है यदि बच्चे के किसी भी विजेट ने ईवेंट को संभाला नहीं है। क्या यह सुनिश्चित करने का कोई तरीका है कि सभी घटनाएं कहीं और संसाधित होने से पहले इस फ़िल्टर पर जाएं? – KyleL

0

बेहतर दृष्टिकोण में से एक को उपयोगकर्ता से इतनी सारी घटनाओं को पकड़ने के बजाय xidle सिग्नल को पकड़ना होगा। यहां एक को QEvent को कैप्चर करने की आवश्यकता है: माउसमोव इवेंट भी

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