Dibujar una superposición en la parte superior de la ventana de una aplicación

Quiero poder pintar encima de la ventana de mi aplicación para poder anotar todos los widgets con información de diagnóstico adicional, similar a las herramientas de desarrollador CSS en Firefox (por ejemplo, agregar clases de widgets, estilos, resaltar bordes, etc.).

Puedo recorrer el árbol de widgets y extraer la información relevante, pero la pregunta es ¿cómo puedo superponer todas las ventanas de la aplicación con esta información?

Una forma sería anular miQMainWindowvento de pintura de @, pero esto debe hacerse para todas las ventanas de nivel superior. ¿Existe un método alternativo donde pueda pintar en laQDesktopWidget ¿por ejemplo? O cualquier gancho en cadaQWidgetEl método de pintura de @? Cualquier cosa que implique subclasificarQWidget en sí no funcionará con los widgets estándar.

Esto sigue a mi pregunta anterior:

Existen herramientas útiles para diagnosticar problemas de diseño y espaciado de Qt?

cheers Mandrill

EDIT: Gracias a Dmitry ahora tengo un método realmente simple que es fácilmente extensible:

class DiagnosticStyle : public QWindowsVistaStyle
{
Q_OBJECT

public: 
    typedef QWindowsVistaStyle BaseStyle;
    void drawControl(ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget) const;
};


void DiagnosticStyle::drawControl(ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget) const
{
    BaseStyle::drawControl(element, option, painter, widget);
    if (widget && painter) {
        // draw a border around the widget
        painter->setPen(QColor("red"));
        painter->drawRect(widget->rect());

        // show the classname of the widget
        QBrush translucentBrush(QColor(255,246,240, 100));
        painter->fillRect(widget->rect(), translucentBrush);
        painter->setPen(QColor("darkblue"));
        painter->drawText(widget->rect(), Qt::AlignLeft | Qt::AlignVCenter, widget->metaObject()->className()); 
    }
}

qApp->setStyle(new DiagnosticStyle());

Respuestas a la pregunta(2)

Su respuesta a la pregunta