一、问题
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%的情况。