C++ 使用QPainter在QTreeWidget上绘制
我正在做一个小程序,里面有很多面板。我希望这样,当我聚焦到一个面板上时,它会在面板周围画一条细线,表明它是聚焦的。除了我的树视图,我的所有面板都可以使用它 下面是一个使用C++ 使用QPainter在QTreeWidget上绘制,c++,qt,qpainter,qtreewidget,C++,Qt,Qpainter,Qtreewidget,我正在做一个小程序,里面有很多面板。我希望这样,当我聚焦到一个面板上时,它会在面板周围画一条细线,表明它是聚焦的。除了我的树视图,我的所有面板都可以使用它 下面是一个使用QWidget的示例: void Test::paintEvent(QPaintEvent *event) { if(hasFocus()) { QPainter painter(this); QPen pen(Qt::blue); pen.setWidth(1)
QWidget
的示例:
void Test::paintEvent(QPaintEvent *event)
{
if(hasFocus())
{
QPainter painter(this);
QPen pen(Qt::blue);
pen.setWidth(1);
painter.setPen(pen);
painter.drawRect(geometry());
}
QWidget::paintEvent(event);
}
当我在QTreeWidget
上使用QPainter
时,我在控制台中得到以下调试消息:
:不应再调用QWidget::paintEngine
:绘制设备返回的引擎==0,类型:1qPaint::begin
:画师未激活QPainter::setPen
:绘制程序未激活qPaint::drawRects
因此,我的问题是我无法将
QPainter
与QTreeWidget
一起使用,因此我无法绘制轮廓。我可以使用其他方法吗?您根本不需要paintEvent
。仅使用样式表(setStyleSheet()
method):
结果:
为什么不在
QTreeWidget
中使用paintEvent
?您可以调用QTreeWidget::paintEvent(event)
来执行超类的绘制,这正是我正在做的。我总是在paint事件中调用超类,但是我确实忘记了将其添加到给定的示例中。但这不是我的问题。我的问题是,我需要围绕QTreeWidget的几何体绘制一个矩形,而这不能通过调用超类来完成。我需要一个QPainter之类的东西……为什么你不能创建一个QPainter
?QTreeWidget
应该是QWidget
的子类。。。顺便说一句,您应该在之外添加QWidget::paintEvent(event)
,如果尝试一下,您就会明白原因。我不知道为什么它不允许我,但我在调试输出中得到了这些消息。我会将它们添加到问题中。您可以尝试创建自己的小部件,并将QTreeWidget
添加到其中,这应该会起作用,但我不知道这是否是最佳选择
QTreeWidget:focus{ border: 1px solid red}
QTreeWidget:!focus{}