QTimer 20ms执行一次paintevent的问题

时间:2022-05-23 21:31:46
linux下用QTimer实现文字滚动,
比如20ms重绘一次(paintevent),在里面左移坐标后重新绘制(drawText),

可是实际画出来的效果是一卡一卡的,滚动慢且不流畅,绝不是20ms移动一次。

有想法的帮帮忙。

13 个解决方案

#1


卡顿的话,首先检查你的paint动作是不是比较耗时。另外QTimer并不能保证20ms的时间间隔。

#2


首先跟定时器精度有关,定时器不一定是 20 毫秒出发一次。
其次和你计算的位置以及文本绘制过程有关,你是不是清空了整个 widget ,画背景,然后再绘制文本?
建议使用一个 QLabel,然后使用 Qt 的动画框架中的QPropertyAnimation ,这样你只需要设置一些属性,别的就什么都不用管了。

#3


paint动作大概需要20ms多一点,QTimer间隔20ms,实际画的时候间隔在400ms以上。

所以paint动作不是主要原因,应该是QTimer慢,而QTimer慢的原因也许是我程序的问题(因为我换个小程序就好一些,虽然保证不了20ms但不至于太卡顿。),

等我试试QPropertyAnimation  多谢

#4


1. QTimer不是个很精确的东西。20ms精度很可能达不到要求:
http://blog.csdn.net/dijunfeng/article/details/7272475
2. QTimer的update依赖于消息循环。如果消息循环执行一轮的时间很长(比如说100ms),那么你的timer至少是100ms执行一次。你有没有干了什么阻塞消息循环的事情?
3. 文字滚动用QLabel左右移动就可以了,为什么要重绘?

#5


引用 4 楼 ison_jaro 的回复:
1. QTimer不是个很精确的东西。20ms精度很可能达不到要求:
http://blog.csdn.net/dijunfeng/article/details/7272475
2. QTimer的update依赖于消息循环。如果消息循环执行一轮的时间很长(比如说100ms),那么你的timer至少是100ms执行一次。你有没有干了什么阻塞消息循环的事情?
3. 文字滚动用QLabel左右移动就可以了,为什么要重绘?


目前还不知道是什么导致的堵塞,文字滚动用QLabel具体是?不用重绘?

#6


引用 2 楼 foruok 的回复:
首先跟定时器精度有关,定时器不一定是 20 毫秒出发一次。
其次和你计算的位置以及文本绘制过程有关,你是不是清空了整个 widget ,画背景,然后再绘制文本?
建议使用一个 QLabel,然后使用 Qt 的动画框架中的QPropertyAnimation ,这样你只需要设置一些属性,别的就什么都不用管了。


这个方法很好,在我PC上面实现了。
但是放到实机上就显示不出,原因不明。。

#7


引用 6 楼 dutxin 的回复:
Quote: 引用 2 楼 foruok 的回复:

首先跟定时器精度有关,定时器不一定是 20 毫秒出发一次。
其次和你计算的位置以及文本绘制过程有关,你是不是清空了整个 widget ,画背景,然后再绘制文本?
建议使用一个 QLabel,然后使用 Qt 的动画框架中的QPropertyAnimation ,这样你只需要设置一些属性,别的就什么都不用管了。


这个方法很好,在我PC上面实现了。
但是放到实机上就显示不出,原因不明。。


纠正一下,实机不是显示不出来,是同样一卡一卡的滚动过去。。

#8


给个建议,使用QTest::qWait(20)也许是个不错的方式。

#9


引用 8 楼 foxyz 的回复:
给个建议,使用QTest::qWait(20)也许是个不错的方式。


任何时候在程序内使用QTest都是不对的 (当然,写测试程序除外)

#10


找到慢的原因是:给滚动用的窗口指定父窗口就会慢,不流畅。
不给文字滚动用的窗口指定父窗口的话,就相对流畅了。。

#11


引用 10 楼 dutxin 的回复:
找到慢的原因是:给滚动用的窗口指定父窗口就会慢,不流畅。
不给文字滚动用的窗口指定父窗口的话,就相对流畅了。。

那可能是滚动文字会不断出发父窗口重绘?按理电脑上重绘也应该花不了多长时间呀。

---------------------------
博文决赛, 投我一票,谢谢。

#12


引用 11 楼 foruok 的回复:
Quote: 引用 10 楼 dutxin 的回复:

找到慢的原因是:给滚动用的窗口指定父窗口就会慢,不流畅。
不给文字滚动用的窗口指定父窗口的话,就相对流畅了。。

那可能是滚动文字会不断出发父窗口重绘?按理电脑上重绘也应该花不了多长时间呀。

---------------------------
博文决赛, 投我一票,谢谢。

果然如此,重绘函数里加载图片什么的处理太多,优化后好了。
问题是父窗口为什么会跟着重绘呢?

#13


子窗口遮住了父窗口,子窗口运动,你说父窗口是否要刷新?不刷新残影情何以堪?
别忘了给我投票啊

#1


卡顿的话,首先检查你的paint动作是不是比较耗时。另外QTimer并不能保证20ms的时间间隔。

#2


首先跟定时器精度有关,定时器不一定是 20 毫秒出发一次。
其次和你计算的位置以及文本绘制过程有关,你是不是清空了整个 widget ,画背景,然后再绘制文本?
建议使用一个 QLabel,然后使用 Qt 的动画框架中的QPropertyAnimation ,这样你只需要设置一些属性,别的就什么都不用管了。

#3


paint动作大概需要20ms多一点,QTimer间隔20ms,实际画的时候间隔在400ms以上。

所以paint动作不是主要原因,应该是QTimer慢,而QTimer慢的原因也许是我程序的问题(因为我换个小程序就好一些,虽然保证不了20ms但不至于太卡顿。),

等我试试QPropertyAnimation  多谢

#4


1. QTimer不是个很精确的东西。20ms精度很可能达不到要求:
http://blog.csdn.net/dijunfeng/article/details/7272475
2. QTimer的update依赖于消息循环。如果消息循环执行一轮的时间很长(比如说100ms),那么你的timer至少是100ms执行一次。你有没有干了什么阻塞消息循环的事情?
3. 文字滚动用QLabel左右移动就可以了,为什么要重绘?

#5


引用 4 楼 ison_jaro 的回复:
1. QTimer不是个很精确的东西。20ms精度很可能达不到要求:
http://blog.csdn.net/dijunfeng/article/details/7272475
2. QTimer的update依赖于消息循环。如果消息循环执行一轮的时间很长(比如说100ms),那么你的timer至少是100ms执行一次。你有没有干了什么阻塞消息循环的事情?
3. 文字滚动用QLabel左右移动就可以了,为什么要重绘?


目前还不知道是什么导致的堵塞,文字滚动用QLabel具体是?不用重绘?

#6


引用 2 楼 foruok 的回复:
首先跟定时器精度有关,定时器不一定是 20 毫秒出发一次。
其次和你计算的位置以及文本绘制过程有关,你是不是清空了整个 widget ,画背景,然后再绘制文本?
建议使用一个 QLabel,然后使用 Qt 的动画框架中的QPropertyAnimation ,这样你只需要设置一些属性,别的就什么都不用管了。


这个方法很好,在我PC上面实现了。
但是放到实机上就显示不出,原因不明。。

#7


引用 6 楼 dutxin 的回复:
Quote: 引用 2 楼 foruok 的回复:

首先跟定时器精度有关,定时器不一定是 20 毫秒出发一次。
其次和你计算的位置以及文本绘制过程有关,你是不是清空了整个 widget ,画背景,然后再绘制文本?
建议使用一个 QLabel,然后使用 Qt 的动画框架中的QPropertyAnimation ,这样你只需要设置一些属性,别的就什么都不用管了。


这个方法很好,在我PC上面实现了。
但是放到实机上就显示不出,原因不明。。


纠正一下,实机不是显示不出来,是同样一卡一卡的滚动过去。。

#8


给个建议,使用QTest::qWait(20)也许是个不错的方式。

#9


引用 8 楼 foxyz 的回复:
给个建议,使用QTest::qWait(20)也许是个不错的方式。


任何时候在程序内使用QTest都是不对的 (当然,写测试程序除外)

#10


找到慢的原因是:给滚动用的窗口指定父窗口就会慢,不流畅。
不给文字滚动用的窗口指定父窗口的话,就相对流畅了。。

#11


引用 10 楼 dutxin 的回复:
找到慢的原因是:给滚动用的窗口指定父窗口就会慢,不流畅。
不给文字滚动用的窗口指定父窗口的话,就相对流畅了。。

那可能是滚动文字会不断出发父窗口重绘?按理电脑上重绘也应该花不了多长时间呀。

---------------------------
博文决赛, 投我一票,谢谢。

#12


引用 11 楼 foruok 的回复:
Quote: 引用 10 楼 dutxin 的回复:

找到慢的原因是:给滚动用的窗口指定父窗口就会慢,不流畅。
不给文字滚动用的窗口指定父窗口的话,就相对流畅了。。

那可能是滚动文字会不断出发父窗口重绘?按理电脑上重绘也应该花不了多长时间呀。

---------------------------
博文决赛, 投我一票,谢谢。

果然如此,重绘函数里加载图片什么的处理太多,优化后好了。
问题是父窗口为什么会跟着重绘呢?

#13


子窗口遮住了父窗口,子窗口运动,你说父窗口是否要刷新?不刷新残影情何以堪?
别忘了给我投票啊