Qt 中update()和repaint()的区别
void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽]
通过立即调用paintEvent()来直接重新绘制窗口部件,如果erase为真,Qt在paintEvent()调用之前擦除区域(x,y,w,h)。
如果w是负数,它被width()-x替换,并且如果h是负数,它被height()-y替换。 如果你需要立即重新绘制,建议使用repaint(),
比如在动画期间。在绝大多数情况下,update()更好,因为它允许Qt来优化速度并且防止闪烁。
警告:如果你在一个函数中调用repaint(),而它自己又被paintEvent()调用,你也许会看到无线循环。
update()函数从来不会产生循环。
void QWidget::update () [槽]
更新窗口部件,当Qt回到主事件中时,它规划了所要处理的绘制事件。这样允许Qt进行优化从而得到比调用repaint()更快的速度和
更少的闪烁。 几次调用update()的结果通常仅仅是一次paintEvent()调用。 Qt通常在paintEvent()调用之前擦除这个窗口部件的
区域,仅仅只有在WRepaintNoErase窗口部件标记被设置的时候才不会。
在这区别中关键点是:repaint()是立即调用paintEvent(),而update()是几次执行才调用一次paintEvent()。
这样update()会造成这样的结果:paintEvent()中的任务没有执行完,就又被update().paintEvent()中被积压的任务越来越多。
程序例子:
(1)问题出现时候的情况(10毫秒每次,用update()。paintEvent()积累了很多处理任务):
- #include<QPainter>
- #include<QDebug>
- #include<QMessageBox>
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- this->showMaximized();
- i = ;
- realWidth = this->width();
- realHeight = this->height();
- pixmap = QPixmap(realWidth,realHeight);
- connect(this,SIGNAL(haveData(QPoint)),this,SLOT(getPointAndDraw(QPoint)));
- connect(&timer,SIGNAL(timeout()),this,SLOT(getPoint()));
- timer.start();
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
- void MainWindow::getPoint()
- {
- if(i < realWidth)
- {
- point = QPoint(i,(uint(qrand())) % realHeight);
- i++;
- }
- else
- {
- i = i % realWidth;
- point = QPoint(i,(uint(qrand())) % realHeight);
- i++;
- }
- emit haveData(point);
- }
- void MainWindow::getPointAndDraw(QPoint point)
- {
- index = point.x();
- QPainter painter(&pixmap);
- painter.setPen(Qt::green);
- painter.drawLine(lastPoint,point);
- painter.setPen(Qt::black);
- painter.setBrush(Qt::red);
- painter.drawRect(index+,,,realHeight);
- if(point.x() < realWidth-)
- lastPoint = point;
- else
- lastPoint = QPoint(,);
- update();
- // this->repaint(index-1,0,5,realHeight);
- }
- void MainWindow::paintEvent(QPaintEvent *e)
- {
- //return ;
- QPainter painter(this);
- QRect target1(, , realWidth, realHeight/);
- QRect target2(, realHeight/, realWidth, realHeight/);
- QRect target3(, *realHeight/, realWidth, realHeight/);
- QRect target4(, *realHeight/, realWidth, realHeight/);
- QRect target5(, *realHeight/, realWidth, realHeight/);
- QRect source(, , realWidth, realHeight);
- painter.drawPixmap(target1,pixmap,source);
- painter.drawPixmap(target2,pixmap,source);
- painter.drawPixmap(target3,pixmap,source);
- painter.drawPixmap(target4,pixmap,source);
- painter.drawPixmap(target5,pixmap,source);
- }
- void MainWindow::resizeEvent(QResizeEvent *e)
- {
- realWidth = this->width();
- realHeight = this->height();
- }
- void MainWindow::changeEvent(QEvent *e)
- {
- QMainWindow::changeEvent(e);
- switch (e->type()) {
- case QEvent::LanguageChange:
- ui->retranslateUi(this);
- break;
- default:
- break;
- }
- }
(2)每隔1000毫秒刷新一次,用update().一秒种有足够的时间处理paintEvent(),无积累
- #include<QPainter>
- #include<QDebug>
- #include<QMessageBox>
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- this->showMaximized();
- i = ;
- realWidth = this->width();
- realHeight = this->height();
- pixmap = QPixmap(realWidth,realHeight);
- connect(this,SIGNAL(haveData(QPoint)),this,SLOT(getPointAndDraw(QPoint)));
- connect(&timer,SIGNAL(timeout()),this,SLOT(getPoint()));
- timer.start();
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
- void MainWindow::getPoint()
- {
- if(i < realWidth)
- {
- point = QPoint(i,(uint(qrand())) % realHeight);
- i++;
- }
- else
- {
- i = i % realWidth;
- point = QPoint(i,(uint(qrand())) % realHeight);
- i++;
- }
- emit haveData(point);
- }
- void MainWindow::getPointAndDraw(QPoint point)
- {
- index = point.x();
- QPainter painter(&pixmap);
- painter.setPen(Qt::green);
- painter.drawLine(lastPoint,point);
- painter.setPen(Qt::black);
- painter.setBrush(Qt::red);
- painter.drawRect(index+,,,realHeight);
- if(point.x() < realWidth-)
- lastPoint = point;
- else
- lastPoint = QPoint(,);
- update();
- // this->repaint(index-1,0,5,realHeight);
- }
- void MainWindow::paintEvent(QPaintEvent *e)
- {
- //return ;
- QPainter painter(this);
- QRect target1(, , realWidth, realHeight/);
- QRect target2(, realHeight/, realWidth, realHeight/);
- QRect target3(, *realHeight/, realWidth, realHeight/);
- QRect target4(, *realHeight/, realWidth, realHeight/);
- QRect target5(, *realHeight/, realWidth, realHeight/);
- QRect source(, , realWidth, realHeight);
- painter.drawPixmap(target1,pixmap,source);
- painter.drawPixmap(target2,pixmap,source);
- painter.drawPixmap(target3,pixmap,source);
- painter.drawPixmap(target4,pixmap,source);
- painter.drawPixmap(target5,pixmap,source);
- }
- void MainWindow::resizeEvent(QResizeEvent *e)
- {
- realWidth = this->width();
- realHeight = this->height();
- }
- void MainWindow::changeEvent(QEvent *e)
- {
- QMainWindow::changeEvent(e);
- switch (e->type()) {
- case QEvent::LanguageChange:
- ui->retranslateUi(this);
- break;
- default:
- break;
- }
- }
- ()继续改进(10毫秒每次,用repaint()。一次repaint(),一次paintEvent(),无积累).
- #include<QPainter>
- #include<QDebug>
- #include<QMessageBox>
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- this->showMaximized();
- i = ;
- realWidth = this->width();
- realHeight = this->height();
- pixmap = QPixmap(realWidth,realHeight);
- connect(this,SIGNAL(haveData(QPoint)),this,SLOT(getPointAndDraw(QPoint)));
- connect(&timer,SIGNAL(timeout()),this,SLOT(getPoint()));
- timer.start();
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
- void MainWindow::getPoint()
- {
- if(i < realWidth)
- {
- point = QPoint(i,(uint(qrand())) % realHeight);
- i++;
- }
- else
- {
- i = i % realWidth;
- point = QPoint(i,(uint(qrand())) % realHeight);
- i++;
- }
- emit haveData(point);
- }
- void MainWindow::getPointAndDraw(QPoint point)
- {
- index = point.x();
- QPainter painter(&pixmap);
- painter.setPen(Qt::green);
- painter.drawLine(lastPoint,point);
- painter.setPen(Qt::black);
- painter.setBrush(Qt::red);
- painter.drawRect(index+,,,realHeight);
- if(point.x() < realWidth-)
- lastPoint = point;
- else
- lastPoint = QPoint(,);
- this->repaint(index-,,,realHeight);
- }
- void MainWindow::paintEvent(QPaintEvent *e)
- {
- //return ;
- QPainter painter(this);
- QRect target1(, , realWidth, realHeight/);
- QRect target2(, realHeight/, realWidth, realHeight/);
- QRect target3(, *realHeight/, realWidth, realHeight/);
- QRect target4(, *realHeight/, realWidth, realHeight/);
- QRect target5(, *realHeight/, realWidth, realHeight/);
- QRect source(, , realWidth, realHeight);
- painter.drawPixmap(target1,pixmap,source);
- painter.drawPixmap(target2,pixmap,source);
- painter.drawPixmap(target3,pixmap,source);
- painter.drawPixmap(target4,pixmap,source);
- painter.drawPixmap(target5,pixmap,source);
- }
- void MainWindow::resizeEvent(QResizeEvent *e)
- {
- realWidth = this->width();
- realHeight = this->height();
- }
- void MainWindow::changeEvent(QEvent *e)
- {
- QMainWindow::changeEvent(e);
- switch (e->type()) {
- case QEvent::LanguageChange:
- ui->retranslateUi(this);
- break;
- default:
- break;
- }
- }
参考:http://www.cnblogs.com/SkylineSoft/articles/2046303.html
http://www.informit.com/articles/article.aspx?p=1405227&seqNum=4
Qt 中update()和repaint()的区别的更多相关文章
- Unity3D中Update和Lateupdate的区别
Unity中Update和Lateupdate的区别.Lateupdate和Update每一祯都被执行,但是执行顺序不一样,先执行Updatee然后执行lateUpdate. 如果你有两个脚本JS1. ...
- Qt常用函数 记录(update erase repaint 的区别)
一界面重载函数使用方法:1在头文件里定义函数protected: void paintEvent(QPaintEvent *event); 2 在CPP内直接重载void ----------::pa ...
- Unity3D中Update()与FixedUpdate()的区别
Unity3D中Update()与FixedUpdate()的区别是什么呢?从字面上理解,它们都是在更新时会被调用,并且会循环的调用.但是Update会在每次渲染新的一帧时,被调用.而FixedUpd ...
- Cocos2d中update与fixedUpdate的区别(六)
它如何工作呢? update:和fixedUpdate:方法实际这样工作. Cocos2D将从iOS接口中取得时间间隔(delta)在你的游戏代码执行期间,并且检查fixedUpdate:方法在间隔期 ...
- Cocos2d中update与fixedUpdate的区别(五)
在真实情况中update:和fixedUpdate方法如何去调用? 由上所述,所以update方法在每帧被调用1次,从而给你一个机会去更新你的游戏对象的状态在其绘制之前.而fixedUpdate:方法 ...
- QT update和repaint的区别
void QWidget::repaint ( int x, int y, int w, int h, bool erase = TRUE ) [槽] 通过立即调用paintEvent()来直接重新绘 ...
- Cocos2d中update与fixedUpdate的区别(四)
关于fixedUpdate:方法的目的 现在,想象一下在小球飞行的位置1到8之间有一个移动的平台: 该平台不停地上升和下降.有些时候小球可以不碰到而飘过平台,有些时候小球会和平台发生碰撞: 这表示小球 ...
- Cocos2d中update与fixedUpdate的区别(三)
没错!现在的情况是很糟糕.因为玩家不会看到平滑的动作. 不管怎样,我们都对此无能为力.玩家期待在1秒后小球出现在位置(8),所以我们应该把球放在那里. 我们不会讨论如何避免掉帧的情况.对于这个例子我们 ...
- Cocos2d中update与fixedUpdate的区别(二)
关于update:方法的目的 update:方法的目的在于给你一个更新你的游戏(你游戏中的所有对象,标签等待)的机会,在它们被渲染到屏幕之前. 换句话说,如果你想要一些游戏对象显示在屏幕的特定位置,你 ...
随机推荐
- HttpServlet请求重定向
方法一: public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcep ...
- C# 的可空合并运算符(??)到底是怎样的宝宝?
前言废语 也怪自己小白和不勤奋,没有系统的学习C#相关的东西,工作一年多还是初级小菜,深感不安,来到园子才发现好多钻研技术的人,也渐渐发现自己开始喜欢上了这个编程的世界.今日偶遇??操作符,发现我只看 ...
- bootstrap 笔记01
bootstrap源码样式: 移除body的margin声明设置body的背景色为白色为排版设置了基本的字体.字号和行高设置全局链接颜色,且当链接处于悬浮“:hover”状态时才会显示下划线样式 1, ...
- H TML5 之 (6)下雨效果
在对HTML5进行研究之后,有了一点想法,思考出游戏其实感觉就是四个步骤 1.创建一个你需要的对象,赋予属性(一些影响方法的属性),方法(运动,叫....) 2.实例化这个对象,让它成为一个或者多个个 ...
- 在Abp框架中使用Mysql数据库的方法以及相关问题小记
最近发现了一款DDD的框架 看起来不错,据说挺流弊的 刚好最近要弄点小东西,拿来试试也不错 苦于穷逼买不起高配服务器,只好装mysql数据库了 下面说下如何在该框架下使用Mysql数据库 打开项目后, ...
- spring配置文件中属性mappingLocations、mappingDirectoryLocations
http://blog.csdn.net/vacblog/article/details/7774173
- EDM推送
一.需求描述: 日前,做了一个发送客户账单的功能,邮件模板采用自定义,生成vm文件,保存至redis, 采用jodd-mail发送邮件,查询用户账单数据,账单明细,缓存加载模板并渲 ...
- 关于项目既要使用ant脚本又要使用maven pom.xml文件的问题
背景:项目使用的是ant脚本打包,但又需要maven去执行sonar代码扫描.所以项目中既有build.xml又有pom.xml build.xml设置的打包后产物文件夹为target,maven运行 ...
- Windows Phone 之手势识别(Flick)
1. 引入dll (silverlight for wndows phone toolkit) 2.引入命名空间 01.xmlns:toolkit="clr-namespace:Micros ...
- Python之练习Demo
遍历本地文件系统 (sys, os, path),例如写一个程序统计一个目录下所有文件大小并按各种条件排序并保存结果,代码如下: #coding:GBK import os; def SortList ...