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