Рисование поверх окна приложения,
Я хочу иметь возможность рисовать поверх окна моего приложения, чтобы я мог аннотировать все виджеты с некоторой дополнительной диагностической информацией, подобной инструментам разработчика 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
возможно, вы захотите сделать что-то вроде этого.