• 7994阅读
  • 7回复

关于动态显示图形的问题 [复制链接]

上一主题 下一主题
离线小小丫
 
只看楼主 倒序阅读 楼主  发表于: 2011-02-23
想实现小黑灯、小红灯和小黄灯自动切换,用下面的代码实现画图:
void Dialog::paintEvent(QPaintEvent *)
{
QPainterPath path;
path.addEllipse(100,100,50,50);
path.addEllipse(200,100,50,50);
QPainter painter(this);
painter.setPen(Qt::green);
if((i%3)==0) painter.setBrush(Qt::black);
if((i%3)==1) painter.setBrush(Qt::red);
if((i%3)==2) painter.setBrush(Qt::yellow);
painter.drawPath(path);
i++;
}
然后用一个计时器:
m_timer = new QTimer( this);
connect(m_timer, SIGNAL(timeout()),this, SLOT(paintEvent(QPaintEvent *)) );
m_timer->start(100);
来让小灯的颜色自动改变。预期的效果是三种颜色的小灯不停地自动切换。
但是为什么小灯的颜色不能自动切换,要人为地去点击一下dialog窗口,小灯的颜色才改变呢?


离线小小丫
只看该作者 1楼 发表于: 2011-02-23
哦,知道怎么回事了,忘记加上
this->update();
这句话了。
离线sbtree
只看该作者 2楼 发表于: 2011-02-23
引用第1楼小小丫于2011-02-23 11:15发表的  :
哦,知道怎么回事了,忘记加上
this->update();
这句话了。

就算你加上了,信号和槽的连接也不合理。
计时器的超时信号应该和widget的update槽连接,同时还要想办法让i++,所以比较合理的做法是写一个槽函数,根计时器的超时信号连接,在该槽内执行i++和调用update
windows 7 + VC++2008 + Qt4.5.2
离线roywillow

只看该作者 3楼 发表于: 2011-02-23
这种connect方式还真没见过……能通过?
连接上update槽就好了,因为i的更新是在paintEvent中,这样也挺方便

感觉不要让i就这么累加上去,万一运行时间长了溢出咋办……
i++后直接来个i %= 3我感觉就不错,判断中就不用带上求余了
然后就是三个if这样写可是每个判断都要执行一遍的哦
[ 此帖被roywillow在2011-02-23 16:54重新编辑 ]
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线sbtree
只看该作者 4楼 发表于: 2011-02-23
引用第3楼roywillow于2011-02-23 16:53发表的  :
这种connect方式还真没见过……能通过?
连接上update槽就好了,因为i的更新是在paintEvent中,这样也挺方便
感觉不要让i就这么累加上去,万一运行时间长了溢出咋办……
i++后直接来个i %= 3我感觉就不错,判断中就不用带上求余了
.......

不错,支持一下。注意i的溢出是思维缜密的好想法,不过计算机是不会对整数加法运算的溢出报错的,也不会引起程序的崩溃。当一个整数变量到达最大值2147483647 (32位带符号整数)再加1的时候,这个变量会简单地变成-2147483648 ,即时计算的结果超出了32位,高出的位会被简单的丢弃,这是计算机的特征。所以类似这种累加的计算时从来不用考虑溢出问题的,除非对结果有特殊的需求。
另外把i的变化放在paintEvent函数中会引起混乱,比如重绘事件由于其他原因被触发,就可能造成在一次计时器触发事件中,灯却发生了多次变化,这就造成了无法预计的逻辑上的错误,切忌!!!
windows 7 + VC++2008 + Qt4.5.2
离线alading514

只看该作者 5楼 发表于: 2011-02-23
请教一下,this->update();
加在什么地方
离线roywillow

只看该作者 6楼 发表于: 2011-02-23
引用第4楼sbtree于2011-02-23 17:35发表的  :
不错,支持一下。注意i的溢出是思维缜密的好想法,不过计算机是不会对整数加法运算的溢出报错的,也不会引起程序的崩溃。当一个整数变量到达最大值2147483647 (32位带符号整数)再加1的时候,这个变量会简单地变成-2147483648 ,即时计算的结果超出了32位,高出的位会被简单的丢弃,这是计算机的特征。所以类似这种累加的计算时从来不用考虑溢出问题的,除非对结果有特殊的需求。
另外把i的变化放在paintEvent函数中会引起混乱,比如重绘事件由于其他原因被触发,就可能造成在一次计时器触发事件中,灯却发生了多次变化,这就造成了无法预计的逻辑上的错误,切忌!!!


看到最后一句话我也恍然大悟了,之前我确实遇到过,移动一下窗口画面就哗哗的变化……
溢出神马的,我是想起了以前用vb的时候的情况……

定义一个private slot
然后在里面写上
i++;
i %= 3;
update();
之后让timer关联这个就ok了
paintEvent里面不对i进行自增,只switch一下i的值就好了

我记得qt有个traffic light的example,那个可以参考一下或许?
[ 此帖被roywillow在2011-02-23 22:34重新编辑 ]
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线小小丫
只看该作者 7楼 发表于: 2011-03-16
哎,一来看到大家的这些回复,学习到了很多东西。
快速回复
限100 字节
 
上一个 下一个