QPainter的 QPainter::end: Painter not active, aborted

328 views
Skip to first unread message

linuxdev lyn

unread,
Jul 12, 2009, 7:04:08 AM7/12/09
to qt-c...@googlegroups.com
大家好,我在qt4.5.1中使用QPainter的时候,QPainter要开始画的时候就在终端输出大量类似
QPainter::setPen: Painter not active
QPainter::setBrush: Painter not active
........
QPainter::setBrush: Painter not active
QPainter::end: Painter not active, aborted
QWidget::paintEngine: Should no longer be called
QPainter::begin: Paint device returned engine == 0, type: 1
.......
QPainter::setPen: Painter not active
QPainter::setBrush: Painter not active
QPainter::end: Painter not active, aborted

的提示。

我的用法是
void MyQWidget::func()
{
   ...

QPainter paint(this);

....

while(line)//链表

{

myColor.intToRGB(line->pen.pen3,r,g,b);

qclor.setRgb(r,g,b);

QPen pen(qclor,line->pen.pen1);

paint.setPen(pen);

paint.drawLine(x0,y0,x1,y1);

line=line->next;

}
paint.end();
.....
}

这个用法也是按照QPainter帮助文档说明的套路来的。
也就是

QPainter paint(this);
paint.SETSOME_ATTRIBUTE()
paint.draw*();
paint.end();

会不会和在while中使用有关?还有上面提示“Painter not active,”但是我检测了每处用到QPainter的,发现都是经过构造函数的,这样子就不应该有Painter not active的情况呀。很奇怪。

请问qt-china的各位大虾,上面那些错误提示可能是什么问题导致的?谢谢!!

Liang Qi

unread,
Jul 12, 2009, 7:16:28 AM7/12/09
to qt-c...@googlegroups.com
如果没记错的话,绘制操作应该在paintEvent中完成。

齐亮

2009/7/12 linuxdev lyn <kjpio...@gmail.com>:
> 大家好,我在qt4.5.1中使用QPainter的时候,QPainter要开始画的时候就在终端输出大量类似


> 我的用法是
> void MyQWidget::func()
> {
>    ...
> QPainter paint(this);
> ....
> while(line)//链表
> {
> myColor.intToRGB(line->pen.pen3,r,g,b);
> qclor.setRgb(r,g,b);
> QPen pen(qclor,line->pen.pen1);
> paint.setPen(pen);
> paint.drawLine(x0,y0,x1,y1);
> line=line->next;
> }
> paint.end();
> .....
> }
>

--
http://www.qiliang.net

linuxdev lyn

unread,
Jul 12, 2009, 7:22:55 AM7/12/09
to qt-c...@googlegroups.com

你说的对,但我已经在构造函数中设置可以在paintEvent()之外了:

this->setAttribute(Qt::WA_PaintOutsidePaintEvent);

。所以很奇怪。
如果在qt-4.5.1-x11下编译同样的源码,运行时就不会出现提示。我在arm板上就会出现这些问题。

2009/7/12 Liang Qi <cavend...@gmail.com>

linuxdev lyn

unread,
Jul 12, 2009, 7:31:21 AM7/12/09
to qt-c...@googlegroups.com

麻烦了,原来qt4.5.1对Qt::WA_PaintOutsidePaintEvent的解释中还有
This flag is not supported on Windows, Mac OS X or Embedded Linux。。。。

这个很可能就是原因了。
那还有什么替代办法吗?请问。

2009/7/12 linuxdev lyn <kjpio...@gmail.com>

Lanser

unread,
Jul 12, 2009, 7:42:25 AM7/12/09
to qt-c...@googlegroups.com
试试 QPainter painter(this->viewport());   ??

2009/7/12 linuxdev lyn <kjpio...@gmail.com>
--
Powered by interests.

linuxdev lyn

unread,
Jul 12, 2009, 7:45:32 AM7/12/09
to qt-c...@googlegroups.com
如果把MyWidget::func()这个函数在

MyWidget::paintEvent( QPaintEvent * )中调用的话,

只能drawText()的结果能马上话出来 , 其他QPaint::draw*()函数都不能马上看不到效果。而是在下次paintEvent()函数被调用才把上一次的结果画出来。


2009/7/12 linuxdev lyn <kjpio...@gmail.com>

linuxdev lyn

unread,
Jul 12, 2009, 8:07:21 AM7/12/09
to qt-c...@googlegroups.com

2009/7/12 linuxdev lyn <kjpio...@gmail.com>

而是在下次paintEvent()函数被调用才把上一次的结果画出来。


我说错了,除了drawText()外,其他在下次也是画不出来的。
还有viewPort()是QPainter的方法,不是QWidge的方法,不能用来初始化QPainter的。

linuxdev lyn

unread,
Jul 12, 2009, 11:45:15 PM7/12/09
to qt-c...@googlegroups.com
这个问题暂时还不好解决,我打算先加上qt3support试试看。

2009/7/12 linuxdev lyn <kjpio...@gmail.com>

linuxdev lyn

unread,
Jul 12, 2009, 11:55:43 PM7/12/09
to qt-c...@googlegroups.com
请问 在qvfb中运行qte 4.5.1 x86程序,如何显示中文字体?我现在qvfb起来了,再运行了qte 4.5.1-x86的程序,./app -qws  -fn wenquanyi ,但是app程序中所有的中文都不能显示显示出来。wenquanyi字体的相应字体文件我已经拷贝到$QTDIR/lib/font下面了。

如果没记错的话,在qte 3.3.x里是有$QTDIR/lib/font/fontdir文件和相应的字体文件,能解决qt3.3.x的qvfb内自己的程序中文问题的。不知道qte 4.5.1的字体文件是怎么安排的?

顺便feed-back一下:昨天在arm板上QPaint提示的错误,重新编译后在qvfb中运行,也产生完全一样的错误提示。(同样没有qt3-support库支持)

2009/7/12 linuxdev lyn <kjpio...@gmail.com>

linuxdev lyn

unread,
Jul 17, 2009, 2:05:54 AM7/17/09
to qt-c...@googlegroups.com
上面的我那些问题,我发现纯粹是浪费时间,因为思路就是错的。qt3的paintEvent( QPaintEvent * )和QPainter在qt4里面运行机制已经有很大改变了。所以再怎么修改,也是不能根本解决 问题的。

正确的思路似乎是,全部重新架构我的源码,而不是从qt3升级到qt4,更不应该用上qt3spport的功能。

另外在试验qt3spport的功能时,解决了一个问题,这里发上来和大家分享:
碰到的问题是:
在链接时报错
formmain.o(.text+0x152fc): In function `FormMain::slotPaint()':
: undefined reference to `Q3Painter::adjustedRectangle(QRect const&)'
formmain.o(.text+0x155e0): In function `FormMain::slotPaint()':
: undefined reference to `Q3Painter::adjustedRectangle(QRect const&)'
formmain.o(.text+0x158e0): In function `FormMain::slotPaint()':
: undefined reference to `Q3Painter::adjustedRectangle(QRect const&)'
formmain.o(.text+0x15acc): In function `$a':
: undefined reference to `Q3Painter::adjustedRectangle(QRect const&)'
collect2: ld returned 1 exit status

但是按照下面文章里的修改方法,把#define QT3_SUPPORT添加到每个文件的头部,还是编译报错。
在使用具有q3support要求的qt4程序的时候,在程序链接时,不会自动链接Q3xxxx库,所以可以在makefile的LIBS =中添加  -lQt3Support 或者.pro中添加一行"QMAKE_LIBS += ..."(pro文件的语法请参考帮助文档)。
而不需要在每个头文件中手动添加#define QT3_SUPPORT。


2009/7/13 linuxdev lyn <kjpio...@gmail.com>

Lanser

unread,
Jul 17, 2009, 4:59:38 AM7/17/09
to qt-c...@googlegroups.com
谢谢分享

2009/7/17 linuxdev lyn <kjpio...@gmail.com>



--
Powered by interests.

QT中文

unread,
Aug 24, 2009, 10:23:10 PM8/24/09
to Qt中文
> QPainter::setPen: Painter not active
> QPainter::setBrush: Painter not active
请教一下楼主,这个log的问题解决了么?
我刚第一次用qt做项目,也遇到了这个问题,
启动画面的时候要打好多这样的log,打完之后才开始显示画面,非常影响速度

> 正确的思路似乎是,全部重新架构我的源码,
这个思路能不能给点提示,
我现在用的是Qt4.5,在arm上运行,代码中暂时还没有直接使用QPainter的地方。
估计是show的时候,哪里默认调用到了吧。
我的画面是用Qt Creator 0.9.1(Based on Qt 4.5.0)新做的

打扰了

Reply all
Reply to author
Forward
0 new messages