在QTreeWidget中绘制直线时的相关问题

绘图事件重写

Posted by 雯饰太一 on May 28, 2023

在QTreeWidget中绘制直线时的相关问题

问题1 QWidget::paintEngine: Should no longer be called

错误如下:

1
2
3
4
5
6
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::save: Painter not active
QPainter::setPen: Painter not active
QPainter::setPen: Painter not active
QPainter::restore: Unbalanced save/restore

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void QRTreeWidget::paintLine()
{

	QPainter painter(this);
	painter.save();

	QPen pen(palette().base().color());
	painter.setPen(pen);
	painter.drawLine(m_oldLine);

	//QPen pen(Qt::green);
	pen.setColor(Qt::green);
	pen.setWidth(1);
	painter.setPen(pen);
	painter.drawLine(m_newLine);

	painter.restore();
}
//错误调用位置:
void QRTreeWidget::dragMoveEvent(QDragMoveEvent* e)
{
	//... ...
	paintLine();
	return QTreeWidget::dragMoveEvent(e);
}
//正确的调用位置
void QRTreeWidget::paintEvent(QPaintEvent* e)
{
	paintLine();
	return QTreeWidget::paintEvent(e);
}

Note: the only place you should create and use a painter is inside paintEvent().[只能在paintEvent中使用或者创建painter]

问题2 WA_PaintOutsidePaintEvent

错误代码如下:

1
1>QRTreeWidget.cpp(9): error C2039: “WA_PaintOutsidePaintEvent”: 不是“Qt”的成员

注:关于WA_PaintOutsidePaintEvent的定义,只能在QT4的文档中找到,在QT5的文档中已经消失。

官方给出的解释如下:

Makes it possible to use QPainter to paint on the widget outside paintEvent(). This flag is not supported on Windows, Mac OS X or Embedded Linux. We recommend that you use it only when porting Qt 3 code to Qt 4.

不适合现有的系统,只适用于X11,其他系统均无效,在其他的系统中,会与到问题1类似情况!

问题3 QPainter painter(this) 绘制无效

1
2
3
4
5
6
7
8
9
10
11
12
//需要适用一下初始化的方式 [还是viewport的问题]
QPainter painter(this->viewport());	
//备注:只有在设置绘制主体为视窗,才能正确显示绘制内容!
//查看QT源码,可见:
#include "qabstractscrollarea.h"

QWidget *viewport() const;
QWidget *QAbstractScrollArea::viewport() const
{
    Q_D(const QAbstractScrollArea);
    return d->viewport;
}