2011-05-06 18 views
11

Quiero pintar en la parte superior 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, bordes resaltados, etc.).Dibujando una superposición en la parte superior de la ventana de una aplicación

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 el evento de pintura de QMainWindow, pero esto tiene que hacerse para todas las ventanas de nivel superior. ¿Hay un método alternativo donde se puede pintar en el QDesktopWidget, por ejemplo? O cualquier gancho en cada método de pintura QWidget? Todo lo que implique la subclasificación de QWidget no funcionará con los widgets estándar.

Esto es consecuencia de mi anterior pregunta:

aplausos Mandril

EDIT: Gracias a Dmitry ahora yo tengo un método muy simple que es fácil 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()); 

Respuesta

6

Puede crear su propia clase de estilo basada en QMotifStyle u otra ... y pintar sobre cualquier widget/control relacionado con la información.

void MyStyle::drawPrimitive(PrimitiveElement element, const QStyleOption *option,QPainter *painter, const QWidget *widget) const 
{ 
    QStyle::State flags = option->state; 
    QRect  rect  = option->rect; 
    QPalette pal  = option->palette; 
    QBrush brush; 

    switch (element) 
    { 
     case PE_FrameTabWidget: 
     { 
      painter->save(); 

       // for example: draw anything on TabWidget 
       painter->drawPixmap(rect,centerPm,centerPm.rect()); 
      painter->restore(); 
     } 
     break; 
     default: 
     QMotifStyle::drawPrimitive(element, option, painter, widget); 
     break; 

    } 
} 
+0

Esa es una buena idea - sería más útil para anular 'Qstyle :: drawControl()' en lugar, como que le da acceso al widget? –

+0

Resulta que esto es exactamente lo que necesitaba - ver mi publicación editada –

Cuestiones relacionadas