Рисование оверлея поверх окна приложения - PullRequest
12 голосов
/ 06 мая 2011

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

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

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

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

веселит Mandrill

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

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 ]

6 голосов
/ 06 мая 2011

Вы можете создать собственный класс стилей на основе 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;

    }
}
2 голосов
/ 06 мая 2011

В этой вики рассказывается о рисовании чего-либо на QWidget.

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

Возможно, вы захотите сделать что-то подобное.

...