I haven't started using Qt 5, so I'm not sure if it does this.
This plugin is good for this and it's also good for implementing a screen saving feature.
Here is the plugin code:
@
#include <qdeclarative.h>
#include <QObject>
#include <QEvent>
#include <QKeyEvent>
#include <QMouseEvent>
#include <QBool>
#include <QApplication>
#include <QDebug>
class QMLKeyEvent : public QObject {
Q_OBJECT
Q_PROPERTY(int key READ key)
Q_PROPERTY(QString text READ text)
Q_PROPERTY(int modifiers READ modifiers)
Q_PROPERTY(bool isAutoRepeat READ isAutoRepeat)
Q_PROPERTY(int count READ count)
Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted)
Q_PROPERTY(int nativeScanCode READ nativeScanCode)
Q_PROPERTY(int type READ type)
public:
QMLKeyEvent(const QKeyEvent &ke, const int n = 0) : _event(ke), _nativeScanCode(n) { _event.setAccepted((false)); }
int key() const { return _event.key(); }
QString text() const { return _event.text(); }
int modifiers() const { return _event.modifiers(); }
bool isAutoRepeat() const { return _event.isAutoRepeat(); }
int count() const { return _event.count(); }
bool isAccepted() const { return _event.isAccepted(); }
void setAccepted(bool accepted) { _event.setAccepted(accepted); }
int nativeScanCode() const { return _nativeScanCode; }
int type() const { return _event.type(); }
private:
QKeyEvent _event;
int _nativeScanCode;
};
class QMLMouseEvent : public QObject {
Q_OBJECT
Q_PROPERTY(int x READ x)
Q_PROPERTY(int y READ y)
Q_PROPERTY(int globalX READ globalX)
Q_PROPERTY(int globalY READ globalY)
Q_PROPERTY(int button READ button)
Q_PROPERTY(int buttons READ buttons)
Q_PROPERTY(int modifiers READ modifiers)
Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted)
public:
QMLMouseEvent(const QMouseEvent &me) : _event(me) { _event.setAccepted(false); }
int x() const { return _event.x(); }
int y() const { return _event.y(); }
int globalX() const { return _event.globalX(); }
int globalY() const { return _event.globalY(); }
int button() const { return _event.button(); }
int buttons() const { return _event.buttons(); }
int modifiers() const { return _event.modifiers(); }
bool isAccepted() { return _event.isAccepted(); }
void setAccepted(bool accepted) { _event.setAccepted(accepted); }
private:
QMouseEvent _event;
};
QML_DECLARE_TYPE(QMLKeyEvent)
QML_DECLARE_TYPE(QMLMouseEvent)
class UserEventFilter : public QObject
{
Q_OBJECT
Q_PROPERTY(bool enabled READ getEnabled WRITE setEnabled NOTIFY enabledChanged)
public:
UserEventFilter(QObject * parent = 0);
virtual ~UserEventFilter();
public: // for properties
bool getEnabled() const;
void setEnabled(const bool enabled);
signals: // for properties
void enabledChanged(bool newEnabled);
signals:
void userEventOccurred();
void keyPressed(QMLKeyEvent *event);
void keyReleased(QMLKeyEvent *event);
void mousePressed(QMLMouseEvent *event);
void mouseReleased(QMLMouseEvent *event);
void mouseMoved(QMLMouseEvent *event);
private:
bool processKeyPress(QEvent *event);
bool processKeyRelease(QEvent *event);
bool processMouseButtonPress(QEvent *event);
bool processMouseButtonRelease(QEvent *event);
bool processMouseMove(QEvent *event);
private: // for properties
bool _enabled;
protected:
bool eventFilter(QObject * obj, QEvent * event);
};
UserEventFilter::UserEventFilter(QObject * parent) : QObject(parent) {
_enabled = true;
qApp->installEventFilter(this);
}
UserEventFilter::~UserEventFilter() {
}
bool UserEventFilter::getEnabled() const {
return _enabled;
}
void UserEventFilter::setEnabled(const bool enabled) {
if(_enabled != enabled) {
_enabled = enabled;
emit enabledChanged(_enabled);
}
}
bool UserEventFilter::processKeyPress(QEvent *event) {
QKeyEvent *e = static_cast<QKeyEvent *>(event);
QMLKeyEvent ke(*e, e->nativeScanCode());
ke.setAccepted(false);
emit keyPressed(&ke);
emit userEventOccurred();
return ke.isAccepted();
}
bool UserEventFilter::processKeyRelease(QEvent *event) {
QKeyEvent *e = static_cast<QKeyEvent *>(event);
QMLKeyEvent ke(*e, e->nativeScanCode());
ke.setAccepted(false);
emit keyReleased(&ke);
emit userEventOccurred();
return ke.isAccepted();
}
bool UserEventFilter::processMouseButtonPress(QEvent *event) {
QMLMouseEvent me(*static_cast<QMouseEvent *>(event));
me.setAccepted(false);
emit mousePressed(&me);
emit userEventOccurred();
return me.isAccepted();
}
bool UserEventFilter::processMouseButtonRelease(QEvent *event) {
QMLMouseEvent me(*static_cast<QMouseEvent *>(event));
me.setAccepted(false);
emit mouseReleased(&me);
emit userEventOccurred();
return me.isAccepted();
}
bool UserEventFilter::processMouseMove(QEvent *event) {
QMLMouseEvent me(*static_cast<QMouseEvent *>(event));
me.setAccepted(false);
emit mouseMoved(&me);
emit userEventOccurred();
return me.isAccepted();
}
bool UserEventFilter::eventFilter(QObject * obj, QEvent * event) {
Q_UNUSED(obj);
if(_enabled) {
switch(event->type()) {
case QEvent::KeyPress:
return processKeyPress(event);
break;
case QEvent::KeyRelease:
return processKeyRelease(event);
break;
case QEvent::MouseButtonPress:
return processMouseButtonPress(event);
break;
case QEvent::MouseButtonRelease:
return processMouseButtonRelease(event);
break;
case QEvent::MouseMove:
return processMouseMove(event);
break;
default:
break;
}
}
return QObject::eventFilter(obj, event);
}
@