Diaglib: Add class DebugProxyStyle.

Add a debug proxy style that wraps around an existing style and outputs
the parameters and return values of its function calls, for debugging
QStyle.

Task-number: QTBUG-47084
Task-number: QTBUG-45055
Change-Id: I638618e83bbac8ca4fdce31441bf4c913e911154
Reviewed-by: Andy Shaw <andy.shaw@theqtcompany.com>
This commit is contained in:
Friedemann Kleint 2015-07-21 16:00:38 +02:00
parent 66cfebc2b3
commit 9720efbd10
4 changed files with 232 additions and 1 deletions

View File

@ -27,6 +27,11 @@ class EventFilter (eventfilter.h):
An event filter that logs Qt events to qDebug() depending on An event filter that logs Qt events to qDebug() depending on
configured categories (for example mouse, keyboard, etc). configured categories (for example mouse, keyboard, etc).
class DebugProxyStyle (debugproxystyle.h)
A proxy style that wraps around an existing style and outputs
the parameters and return values of its function calls, useful
for debugging QStyle.
function glInfo() (glinfo.h): function glInfo() (glinfo.h):
Returns a string describing the Open GL configuration (obtained Returns a string describing the Open GL configuration (obtained
by querying GL_VENDOR and GL_RENDERER). Available only by querying GL_VENDOR and GL_RENDERER). Available only

View File

@ -0,0 +1,161 @@
/****************************************************************************
**
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
** following information to ensure the GNU Lesser General Public License
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** As a special exception, The Qt Company gives you certain additional
** rights. These rights are described in The Qt Company LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "debugproxystyle.h"
#include <QDebug>
#include <QWidget>
#include <QStyleOption>
#include <QApplication>
#if QT_VERSION < 0x050000
QDebug operator<<(QDebug d, const QPixmap &p)
{
d << "QPixmap(" << p.size() << ')';
return d;
}
#endif // QT_VERSION < 0x050000
QDebug operator<<(QDebug debug, const QStyleOption *option)
{
#if QT_VERSION >= 0x050000
QDebugStateSaver saver(debug);
debug.nospace();
#endif
debug << "QStyleOption(";
if (option)
debug << "rec=" << option->rect;
else
debug << '0';
debug << ')';
return debug;
}
namespace QtDiag {
DebugProxyStyle::DebugProxyStyle(QStyle *style) : QProxyStyle(style)
{
#if QT_VERSION >= 0x050000
const qreal devicePixelRatio = qApp->devicePixelRatio();
#else
const qreal devicePixelRatio = 1;
#endif
qDebug() << __FUNCTION__ << QT_VERSION_STR
#if QT_VERSION >= 0x050000
<< QGuiApplication::platformName()
#endif
<< style->objectName() << "devicePixelRatio=" << devicePixelRatio;
}
void DebugProxyStyle::drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const
{
qDebug() << __FUNCTION__ << "element=" << element << option << widget;
QProxyStyle::drawPrimitive( element, option, painter, widget);
}
void DebugProxyStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const
{
qDebug() << __FUNCTION__ << "element=" << element << option << widget;
QProxyStyle::drawControl(element, option, painter, widget);
}
void DebugProxyStyle::drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const
{
qDebug() << __FUNCTION__ << "control=" << control << option << widget;
QProxyStyle::drawComplexControl(control, option, painter, widget);
}
void DebugProxyStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment, const QPixmap &pixmap) const
{
qDebug() << __FUNCTION__ << rect << "alignment=" << alignment << pixmap;
QProxyStyle::drawItemPixmap(painter, rect, alignment, pixmap);
}
QSize DebugProxyStyle::sizeFromContents(QStyle::ContentsType type, const QStyleOption *option, const QSize &size, const QWidget *widget) const
{
const QSize result = QProxyStyle::sizeFromContents(type, option, size, widget);
qDebug() << __FUNCTION__ << size << "type=" << type << option << widget << "returns" << result;
return result;
}
QRect DebugProxyStyle::subElementRect(QStyle::SubElement element, const QStyleOption *option, const QWidget *widget) const
{
const QRect result = QProxyStyle::subElementRect(element, option, widget);
qDebug() << __FUNCTION__ << "element=" << element << option << widget << "returns" << result;
return result;
}
QRect DebugProxyStyle::subControlRect(QStyle::ComplexControl cc, const QStyleOptionComplex *opt, QStyle::SubControl sc, const QWidget *widget) const
{
const QRect result = QProxyStyle::subControlRect(cc, opt, sc, widget);
qDebug() << __FUNCTION__ << "cc=" << cc << "sc=" << sc << opt << widget << "returns" << result;
return result;
}
QRect DebugProxyStyle::itemTextRect(const QFontMetrics &fm, const QRect &r, int flags, bool enabled, const QString &text) const
{
const QRect result = QProxyStyle::itemTextRect(fm, r, flags, enabled, text);
qDebug() << __FUNCTION__ << r << "flags=" << flags << "enabled=" << enabled
<< text << "returns" << result;
return result;
}
QRect DebugProxyStyle::itemPixmapRect(const QRect &r, int flags, const QPixmap &pixmap) const
{
const QRect result = QProxyStyle::itemPixmapRect(r, flags, pixmap);
qDebug() << __FUNCTION__ << r << "flags=" << flags << pixmap << "returns" << result;
return result;
}
int DebugProxyStyle::pixelMetric(QStyle::PixelMetric metric, const QStyleOption *option, const QWidget *widget) const
{
const int result = QProxyStyle::pixelMetric(metric, option, widget);
qDebug() << __FUNCTION__ << "metric=" << metric << option << widget << "returns" << result;
return result;
}
QPixmap DebugProxyStyle::standardPixmap(QStyle::StandardPixmap standardPixmap, const QStyleOption *opt, const QWidget *widget) const
{
const QPixmap result = QProxyStyle::standardPixmap(standardPixmap, opt, widget);
qDebug() << __FUNCTION__ << "standardPixmap=" << standardPixmap << opt << "returns" << result;
return result;
}
QPixmap DebugProxyStyle::generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap, const QStyleOption *opt) const
{
const QPixmap result = QProxyStyle::generatedIconPixmap(iconMode, pixmap, opt);
qDebug() << __FUNCTION__ << "iconMode=" << iconMode << pixmap << opt << "returns" << result;
return result;
}
} // namespace QtDiag

View File

@ -0,0 +1,63 @@
/****************************************************************************
**
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
** following information to ensure the GNU Lesser General Public License
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** As a special exception, The Qt Company gives you certain additional
** rights. These rights are described in The Qt Company LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef DEBUGPROXYSTYLE_H
#define DEBUGPROXYSTYLE_H
#include <QProxyStyle>
namespace QtDiag {
class DebugProxyStyle : public QProxyStyle {
Q_OBJECT
public:
explicit DebugProxyStyle(QStyle *style);
void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = 0) const;
void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = 0) const;
void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = 0) const;
void drawItemPixmap(QPainter *painter, const QRect &rect, int alignment, const QPixmap &pixmap) const;
QSize sizeFromContents(ContentsType type, const QStyleOption *option, const QSize &size, const QWidget *widget) const;
QRect subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget) const;
QRect subControlRect(ComplexControl cc, const QStyleOptionComplex *opt, SubControl sc, const QWidget *widget) const;
QRect itemTextRect(const QFontMetrics &fm, const QRect &r, int flags, bool enabled, const QString &text) const;
QRect itemPixmapRect(const QRect &r, int flags, const QPixmap &pixmap) const;
int pixelMetric(PixelMetric metric, const QStyleOption *option = 0, const QWidget *widget = 0) const;
QPixmap standardPixmap(StandardPixmap standardPixmap, const QStyleOption *opt, const QWidget *widget = 0) const;
QPixmap generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap, const QStyleOption *opt) const;
};
} // namespace QtDiag
#endif // DEBUGPROXYSTYLE_H

View File

@ -3,12 +3,14 @@ SOURCES += \
$$PWD/textdump.cpp \ $$PWD/textdump.cpp \
$$PWD/eventfilter.cpp \ $$PWD/eventfilter.cpp \
$$PWD/qwindowdump.cpp \ $$PWD/qwindowdump.cpp \
$$PWD/debugproxystyle.cpp
HEADERS += \ HEADERS += \
$$PWD/textdump.h \ $$PWD/textdump.h \
$$PWD/eventfilter.h \ $$PWD/eventfilter.h \
$$PWD/qwindowdump.h \ $$PWD/qwindowdump.h \
$$PWD/nativewindowdump.h $$PWD/nativewindowdump.h \
$$PWD/debugproxystyle.h
win32 { win32 {
SOURCES += $$PWD/nativewindowdump_win.cpp SOURCES += $$PWD/nativewindowdump_win.cpp