问题记录setStyleSheet:Qt样式表频繁设置导致CPU占用过高问题

一、问题

APP控件:

QWidget:主窗口,背景利用setStyleSheet设置,同时重写paintEvent事件(QWigdet的paintEvent默认为空):

void mainWidget::paintEvent(QPaintEvent *event)
{
    QStylePainter painter(this);
    QStyleOption opt;
    opt.initFrom(this);
    opt.rect = this->rect();
    painter.drawPrimitive(QStyle::PE_Widget,opt);
    QWidget::paintEvent(event);
}

主窗口上有众多不规则按键(某些按键组合成按键组,按下一个按键按键组的外观一起改变,通过设置样式表实现),每个按键都setMask设置有效区域

按键在按下,松开,选中都会有不同的样式,通过setStyleSheet设置。

结果发现,按键在响应过程中非常慢,top看一下CPU占用率在点击按键时达到了90%+


二、问题分析

重绘事件在控件外观发生变化时会被调用。

猜测:可能在操作按键(按下,松开,点击)时在其槽函数改变按键的样式表,按键为主窗口的子控件。所以也会操作到主窗口的样式表。

也即,主窗口的重绘事件也被调用。也就导致了每点击一个按键,最少也要调用三次主窗口的重绘事件。重复多次调用重绘事件使得在嵌入式平台中响应速度变慢。


三、问题解决

主窗口不使用样式表方式设置背景,改用调色板方式,此时主窗口样式表为空

mainWidget::mainWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::mainWidget)
{
    QPixmap pixmap;
    QPalette palette;
    setWindowFlags(Qt::FramelessWindowHint);
    pixmap.load(":/images/res/mianbackground.png");
    palette.setBrush(QPalette::Window, QBrush(pixmap));
    setPalette(palette);
    ui->setupUi(this);
···
}

此时操作按键,CPU占用率已经大大减小了,基本不会有超过10%的情况。


 

你可能感兴趣的:(嵌入式Linux-Qt开发)