2010-07-27 12 views
5

Qt QMainWindow'da kullanıcının hareketsizliğini nasıl algılayabilirim? Benim fikrim şu ana kadar belli bir değer geçtiyse, uygulamayı kilitleyen bir sayacı artıran bir QTimer'e sahip olmaktır. Herhangi bir fare veya anahtar etkileşimi, zamanlayıcıyı 0'a geri ayarlamalıdır. Bununla birlikte, sıfırlanan giriş olaylarını doğru şekilde nasıl kullanacağımı bilmem gerekir; Ben uygulamak yeniden edebilirsiniz:Qt'de kullanıcı hareketsizliği nasıl tespit edilir?

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) 

... ama QMainWindow tüm widget olay işleyicileri QMainWindow en ulaşmasını bu denetimlere meydana gelen olayları engel olmaz? Kullanıcı etkinliğini olduğu gibi tespit etmek için daha iyi bir mimari var mı?

cevap

7

Uygulamanızın aldığı tüm klavye ve fare olaylarını çocuk widget'larına geçmeden önce işlemek için özel bir etkinlik filtresi kullanabilirsiniz.

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); 
    } 
} 

Sonra Bu kesinlikle çalışır

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

gibi bir şey kullanmak (Kendim denedim).

DÜZENLEME: Ve ereOn'a, daha önceki çözümümün çok kullanışlı olmadığını belirttiğim için çok teşekkürler.

+0

İşleri harika, teşekkürler. "ResetMyTimer" olan obj parametresiyle bir sinyal gönderdim ve her pencere sinyali sıfırlama zamanlayıcı yuvasına taktı. Bu, her pencerenin bağımsız olarak kilitlenmesi için * bu * pencere üzerindeki bir pencere öğesinin olayı oluşturup oluşturmadığını kontrol eder. Diğerlerinin –

+0

Olay, yalnızca çocuk widget'larının hiçbiri söz konusu etkinliği ele almazsa yalnızca eventFilter() öğesine gönderilir gibi görünüyor. Tüm olayların başka bir yerde işlenmeden önce bu filtreye gitmesini sağlamanın bir yolu var mı? – KyleL

0

Daha iyi bir yaklaşım, kullanıcılardan çok fazla olay yakalamak yerine xidle sinyalini yakalamak olacaktır. Burada bir QEvent: MouseMove olayını da yakalamanız gerekiyor:

İlgili konular