使用Qtimer时,当改变窗口大小,动画会加快,这是什么情况

craboy1 2017-04-16 11:36:20


#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QTimer>

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
setMouseTracking(true);
timer = new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(update()));
timer->start(100);
angle = 0;
}

Widget::~Widget()
{
delete ui;
}

void Widget::paintEvent(QPaintEvent * event)
{
angle +=10;
if(angle==360){
angle =10;
}
QPainter painter(this);
painter.setWindow(-50,-50,100,100);
painter.rotate(angle);
painter.setBrush(Qt::red);
painter.drawRect(0,0,20,20);
}

...全文
555 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
楼上几位说的都有道理,angle大小的改变应该放在定时器超时函数里。应该定义一个槽作为定时器的超时函数,然后在超时函数里改变angle的大小,再调用update()函数。
懒懒的吉他手 2017-05-17
  • 打赏
  • 举报
回复
改变窗口大小会多次调paintEvent,解决办法楼上说的很清楚了
  • 打赏
  • 举报
回复
你每次调用paintEvent方法,都要重新创建timer。定时器应该放在稳定的方法中,比如构造函数。
孔方发发 2017-05-02
  • 打赏
  • 举报
回复

    angle +=10;
    if(angle==360){
        angle =10;
    }
放定时器超时函数里
caiwei_cs 2017-04-18
  • 打赏
  • 举报
回复
angle的改变放错地方了。
dext 2017-04-17
  • 打赏
  • 举报
回复
动画状态的改变应该是在定时器里,而不是在重画的部分。定时器执行代码完了以后 调用update 就行了。
jun_01 2017-04-17
  • 打赏
  • 举报
回复
angle +=10; 不要放在paintEvent里面,放在定时器事件里面。 因为窗口缩放时,会不停的调用paintEvent,每调用一次,你的进度就加10,动画就会变快了。

16,214

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧