当前位置:编程学习 > wap >>

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

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

详细的说下程序实现,QTimer每隔30ms产生一个信号,槽函数中调用update造成窗口重绘,重载了paintevent函数,函数中调用drawtext来画文本,每次画的时候位置都+1。运行之后CPU1%,后来把这个窗口嵌入到父窗口中(只是生成的时候传进了另外一个窗口的对象作为参数,然后设置了子窗口在父窗口中的位置),子窗口类的代码完全没有变化,运行之后发现CPU飙升到30%?
现在的想法是:
1、可能子窗口中发送update之后,事件循环需要经过父窗口,但是CPU也不至于这么高啊
2、会不会子窗口重绘的时候引起父窗口重绘(重叠的部分,比如父窗口的背景也被重绘了),但是CPU不应该飙升的这么高啊
求大神解惑,我是菜鸟 刚入手的QT,可能是低级错误,大哥大姐些别嘲笑啊 !
有没有解决方案之类的?现在感觉自己一点思绪也没有啊 --------------------编程问答-------------------- 太简单了?大婶们都不屑于回复了? --------------------编程问答-------------------- 第一次发帖 竟然没人回复,哎!伤心啊。 --------------------编程问答-------------------- 据我的了解 应该不会,可能是你子窗口 和父窗口 之间的某种 关系 导致的。你发个代码吧。 --------------------编程问答--------------------
引用 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);
} --------------------编程问答--------------------
引用 3 楼 dext 的回复:
据我的了解 应该不会,可能是你子窗口 和父窗口 之间的某种 关系 导致的。你发个代码吧。


update的事件循环先子窗口再父窗口,并且repaint根本就不经过事件循环,我试了update和repaint发现cpu仍然30%多,并且后来我把paintevent中的代码注释掉,cpu仍然30%多,是不是子窗口重绘造成了父窗口的重绘(父窗口有背景图片)??
补充:移动开发 ,  Qt
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,