Improve diaglib.

- Fix prototype for glinfo() for Qt 4
- Add more event types and object type flags to event filter.

Change-Id: Ia4160b40486d054e860a339e7b5c9c28695330ae
Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
Reviewed-by: Andy Shaw <andy.shaw@digia.com>
This commit is contained in:
Friedemann Kleint 2014-11-21 16:52:06 +01:00
parent 6593531a4d
commit f96cd3187d
3 changed files with 57 additions and 6 deletions

View File

@ -52,6 +52,8 @@ EventFilter::EventFilter(QObject *p)
void EventFilter::init(EventCategories eventCategories)
{
m_objectTypes = OtherType | QWidgetType | QWindowType;
if (eventCategories & MouseEvents) {
m_eventTypes << QEvent::MouseButtonPress << QEvent::MouseButtonRelease
<< QEvent::MouseButtonDblClick << QEvent::NonClientAreaMouseButtonPress
@ -79,6 +81,13 @@ void EventFilter::init(EventCategories eventCategories)
m_eventTypes << QEvent::KeyPress << QEvent::KeyRelease << QEvent::ShortcutOverride
<< QEvent::Shortcut;
}
if (eventCategories & FocusEvents) {
m_eventTypes
#if QT_VERSION >= 0x050000
<< QEvent::FocusAboutToChange
#endif
<< QEvent::FocusIn << QEvent::FocusOut;
}
if (eventCategories & GeometryEvents)
m_eventTypes << QEvent::Move << QEvent::Resize;
if (eventCategories & PaintEvents) {
@ -88,18 +97,44 @@ void EventFilter::init(EventCategories eventCategories)
m_eventTypes << QEvent::Expose;
#endif
}
if (eventCategories & StateChangeEvents) {
m_eventTypes
<< QEvent::WindowStateChange
<< QEvent::WindowBlocked << QEvent::WindowUnblocked
#if QT_VERSION >= 0x050000
<< QEvent::ApplicationStateChange
#endif
<< QEvent::ApplicationActivate << QEvent::ApplicationDeactivate;
}
if (eventCategories & TimerEvents)
m_eventTypes << QEvent::Timer << QEvent::ZeroTimerEvent;
if (eventCategories & ObjectEvents) {
m_eventTypes << QEvent::ChildAdded << QEvent::ChildPolished
<< QEvent::ChildRemoved << QEvent::Create << QEvent::Destroy;
}
if (eventCategories & InputMethodEvents) {
m_eventTypes << QEvent::InputMethod;
#if QT_VERSION >= 0x050000
m_eventTypes << QEvent::InputMethodQuery;
#endif
}
}
static inline bool matchesType(const QObject *o, EventFilter::ObjectTypes types)
{
if (o->isWidgetType())
return types & EventFilter::QWidgetType;
#if QT_VERSION >= 0x050000
if (o->isWindowType())
return types & EventFilter::QWindowType;
#endif
return types & EventFilter::OtherType;
}
bool EventFilter::eventFilter(QObject *o, QEvent *e)
{
static int n = 0;
if (m_eventTypes.contains(e->type())) {
if (matchesType(o, m_objectTypes) && m_eventTypes.contains(e->type())) {
QDebug debug = qDebug().nospace();
const QString on = o->objectName();
debug << '#' << n++ << ' ' << o->metaObject()->className();

View File

@ -52,25 +52,41 @@ public:
TabletEvents = 0x00008,
DragAndDropEvents = 0x00010,
KeyEvents = 0x00020,
GeometryEvents = 0x00040,
PaintEvents = 0x00080,
TimerEvents = 0x00100,
ObjectEvents = 0x00200
FocusEvents = 0x00040,
GeometryEvents = 0x00080,
PaintEvents = 0x00100,
StateChangeEvents = 0x00200,
InputMethodEvents = 0x00400,
TimerEvents = 0x00800,
ObjectEvents = 0x01000,
AllEvents = 0xFFFFF
};
Q_DECLARE_FLAGS(EventCategories, EventCategory)
enum ObjectType {
QWindowType = 0x1,
QWidgetType = 0x2,
OtherType = 0x4
};
Q_DECLARE_FLAGS(ObjectTypes, ObjectType)
explicit EventFilter(EventCategories eventCategories, QObject *p = 0);
explicit EventFilter(QObject *p = 0);
bool eventFilter(QObject *, QEvent *);
ObjectTypes objectTypes() const { return m_objectTypes; }
void setObjectTypes(ObjectTypes objectTypes) { m_objectTypes = objectTypes; }
private:
void init(EventCategories eventCategories);
QList<QEvent::Type> m_eventTypes;
ObjectTypes m_objectTypes;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(EventFilter::EventCategories)
Q_DECLARE_OPERATORS_FOR_FLAGS(EventFilter::ObjectTypes)
} // namespace QtDiag

View File

@ -102,7 +102,7 @@ static QString getGlString(GLenum name)
return QString();
}
QString glInfo(const QWidget *)
QString glInfo(const QObject *)
{
return getGlString(GL_VENDOR) + QLatin1Char('\n') + getGlString(GL_RENDERER);
}