Рисование поверх окна приложения,

Я хочу иметь возможность рисовать поверх окна моего приложения, чтобы я мог аннотировать все виджеты с некоторой дополнительной диагностической информацией, подобной инструментам разработчика CSS в Firefox (например, добавлять классы виджетов, стили, выделять границы и т. д.).

Я могу ходить по дереву виджетов и извлекать соответствующую информацию, но вопрос в том, как я могу наложить все окна приложений с этой информацией?

одним из способов было бы переопределить мой QMainWindowс краской событие, но это должно быть сделано для всех окон верхнего уровня. Есть ли альтернативный метод, где вы можете рисовать на QDesktopWidget например? Или любые крючки в каждом QWidgetметод краски? Все, что включает подклассы не будет работать со стандартными виджетами.

это следует из моего предыдущего вопроса:

ура Мандрил!--6-->

изменить: Благодаря Дмитрию у меня теперь есть очень простой метод, который легко расширяется:

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());

2 ответов


вы можете создать собственный класс стиля на основе QMotifStyle или другого ... и нарисуйте на любом виджете / элементе управления связанную с ним информацию.

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;

    }
}

эта Вики объясняет, как рисовать что-то на QWidget.

http://developer.nokia.com/community/wiki/Archived:How_to_overlay_QWidget_on_top_of_another

возможно, вы захотите сделать что-то вроде этого.