我希望能够在我的应用程序窗口上绘制,以便我可以使用一些额外的诊断信息来注释所有小部件,类似于Firefox中的CSS开发人员工具(例如,添加小部件类,样式,突出显示边框等)
我可以遍历小部件树并提取相关信息,但问题是如何使用此信息覆盖所有应用程序窗口?
一种方法是覆盖我的QMainWindow
的绘画事件,但必须为所有顶级窗口完成此操作。是否有替代方法可以在QDesktopWidget
上进行绘制?或者每个QWidget
的绘画方法有什么钩子?任何涉及子类QWidget
本身的内容都不适用于标准小部件。
这是我之前提出的问题:
欢呼声 山魈
编辑: 感谢德米特里,我现在有了一个非常简单的方法,可以轻松扩展:
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());
答案 0 :(得分:6)
您可以根据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;
}
}
答案 1 :(得分:2)
这个wiki解释了如何在QWidget上绘制内容。
http://developer.nokia.com/community/wiki/Archived:How_to_overlay_QWidget_on_top_of_another
您可能想要做这样的事情。
答案 2 :(得分:0)
在Qt5的某个地方,样式(GTK,Windows等)是内部样式。现在,您需要使用QCommonStyle。
如果有人想知道如何使用Qt5 +做到这一点。这是上面@the_mandrill的代码的独立版本。
class DiagnosticStyle : public QCommonStyle
{
Q_OBJECT
public:
typedef QStyle BaseStyle;
void drawControl(ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget) const
{
QCommonStyle::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());