• 7383阅读
  • 6回复

paintEvent是一个怎样的调用机制? [复制链接]

上一主题 下一主题
离线qfmeal
 

只看楼主 正序阅读 楼主  发表于: 2014-08-27
环境如下:
Qt版本5.3      win7
直接使用qt creator生成的工程,不带ui文件,生成类Dialog继承于QDialog

代码如下:
我在Dialog头文件添加paintEvent函数的声明:
  1. protected:
  2.         void paintEvent(QPaintEvent * );

在paintEvent函数中添加如下代码:
  1. void Dialog::paintEvent(QPaintEvent * )
  2. {
  3.     static int x=0;
  4.     qDebug()<<x++;
  5. }


现象:
当我拖动改变窗口大小时,程序会输出paintEvent的调用次数。很正常。

但是我向Dialog的构造函数添加了一行代码:
QPushButton * pushButton = new QPushButton( "OK",this );
就发现程序输出的数字很快的,不停的刷新,这就意味着paintEvent被不停的调用。

我想问一下高手为什么就加了上面一行代码,paintEvent函数就会被不停的调用?
离线qfmeal

只看该作者 6楼 发表于: 2014-08-28
刚才在qt官网下载了qt-opensource-windows-x86-mingw482_opengl-5.3.1.exe

在Dialog构造中添加
QPushButton * pushButton = new QPushButton( "OK",this );
paintEvent还是会不停刷新。

如果添加下面的控件:
QWidget * widget = new QWidget( this );
或者:
QWidget * widget = new QWidget( this );
    QLabel * label = new QLabel(widget);
就不存在paintEvent一直刷新的问题。
离线dbzhang800

只看该作者 5楼 发表于: 2014-08-28
回 qfmeal 的帖子
qfmeal:我晚上也去下载个5.3.1试一试,如果5.3.1没有不停刷新的问题,说明我这个版本的Qt有bug。
刚才看了下我的qt版本,如下:
[图片]
 (2014-08-27 17:25) 

这是你Qt Creator自身所使用的Qt的版本,并不一定是你的Qt版本
离线qfmeal

只看该作者 4楼 发表于: 2014-08-27
我晚上也去下载个5.3.1试一试,如果5.3.1没有不停刷新的问题,说明我这个版本的Qt有bug。
刚才看了下我的qt版本,如下:


离线uidab

只看该作者 3楼 发表于: 2014-08-27
XP下,5.3.1测试了一下,如果不点击按钮是不会有输出的。不知道你说的不停地刷新是不是BUG。
看一下文档
A paint event is a request to repaint all or part of a widget. It can happen for one of the following reasons:

repaint() or update() was invoked,
the widget was obscured and has now been uncovered, or
many other reasons.
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线qfmeal

只看该作者 2楼 发表于: 2014-08-27
不添加那行QPushButton代码,和添加那行代码相比。  paintEvent不停调用导致CPU使用率上升10%
离线dbzhang800

只看该作者 1楼 发表于: 2014-08-27
这个比较奇怪,如果你描述属实,不排除是Qt自身的bug
快速回复
限100 字节
 
上一个 下一个