QT 在子窗口中显示动画cpu飙升,父窗口中显示动画基本不占cpu

wangmaotao 2013-12-19 03:48:50
QT中生成一个窗口(没有父窗口的QWidget)用来显示动画(其实就是每隔30ms画一次文本,让文本看起来是移动的),发现CPU也就是1%左右,后面把这个窗口嵌入到顶级窗口里面,突然发现cpu飙升到30%,这是什么原因?

详细的说下程序实现,QTimer每隔30ms产生一个信号,槽函数中调用update造成窗口重绘,重载了paintevent函数,函数中调用drawtext来画文本,每次画的时候位置都+1。运行之后CPU1%,后来把这个窗口嵌入到父窗口中(只是生成的时候传进了另外一个窗口的对象作为参数,然后设置了子窗口在父窗口中的位置),子窗口类的代码完全没有变化,运行之后发现CPU飙升到30%?
现在的想法是:
1、可能子窗口中发送update之后,事件循环需要经过父窗口,但是CPU也不至于这么高啊
2、会不会子窗口重绘的时候引起父窗口重绘(重叠的部分,比如父窗口的背景也被重绘了),但是CPU不应该飙升的这么高啊
求大神解惑,我是菜鸟 刚入手的QT,可能是低级错误,大哥大姐些别嘲笑啊 !
有没有解决方案之类的?现在感觉自己一点思绪也没有啊
...全文
466 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
dutxin 2014-07-16
  • 打赏
  • 举报
回复
解决了吗,我也遇到类似问题 而且,QTimer 30ms重绘一次的处理很慢,窗口的更新不流畅。
wangmaotao 2013-12-20
  • 打赏
  • 举报
回复
引用 3 楼 dext 的回复:
据我的了解 应该不会,可能是你子窗口 和父窗口 之间的某种 关系 导致的。你发个代码吧。
update的事件循环先子窗口再父窗口,并且repaint根本就不经过事件循环,我试了update和repaint发现cpu仍然30%多,并且后来我把paintevent中的代码注释掉,cpu仍然30%多,是不是子窗口重绘造成了父窗口的重绘(父窗口有背景图片)??
wangmaotao 2013-12-20
  • 打赏
  • 举报
回复
引用 3 楼 dext 的回复:
据我的了解 应该不会,可能是你子窗口 和父窗口 之间的某种 关系 导致的。你发个代码吧。
QWidget *m_empty = new QWidget; m_empty->setGeometry(0,0,1080,1920); QPalette m_npalette; m_npalette.setBrush(QPalette::Background,QPixmap("mainBG.jpg")); m_empty->setPalette(m_npalette); ActiveLabel *pActiveLabel = new ActiveLabel(m_empty); m_empty->show(); 下面是子窗口类的代码: m_notice_timer = new QTimer; connect(m_notice_timer,SIGNAL(timeout()),this,SLOT(slot_play_notice())); QTimer::singleShot(3*1000,this,SLOT(slot_play_default_notice())); setAutoFillBackground(true); QPalette pal = palette(); pal.setColor(QPalette::Background, QColor(0x00,0xff,0x00,0x00));//设置背景色为透明 setPalette(pal); resize(1024,56); move(56,833); void ActiveLabel::setNotice(const QString & notice) { defaultNotice = notice; QRect rect = m_fm->boundingRect(notice); m_notice_width = (rect.width()) + 10; m_notice_timer->start(30); } void ActiveLabel::slot_play_default_notice() { if (defaultNotice=="")//如果没有公告信息,则添加默认公告信息 { defaultNotice = "QT 在子窗口中显示动画cpu飙升,父窗口中显示动画基本不占cpu "; setNotice(defaultNotice); } } void ActiveLabel::slot_play_notice() { m_notice_position--; if (m_notice_position + m_notice_width < 0) { m_notice_position = 0; } rupdate(); } void ActiveLabel::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setFont(*m_notice_font); painter.setPen(QColor("#ffffff")); painter.drawText(m_notice_position, 41, defaultNotice); }
dext 2013-12-19
  • 打赏
  • 举报
回复
据我的了解 应该不会,可能是你子窗口 和父窗口 之间的某种 关系 导致的。你发个代码吧。
wangmaotao 2013-12-19
  • 打赏
  • 举报
回复
第一次发帖 竟然没人回复,哎!伤心啊。
wangmaotao 2013-12-19
  • 打赏
  • 举报
回复
太简单了?大婶们都不屑于回复了?

16,240

社区成员

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

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