今天处理一个程序打开CPU就占用超过20%(6核的i5-9400)的问题。
排查后将问题锁定在程序切换主题的代码上,程序打开后会发出一个事件,设置主题。
设置主题时候大量调用了setStyleSheet设置窗口样式,一开始我以为是大量调用了setStyleSheet导致CPU占用过高,搜索发现很多人也说频繁调用setStyleSheet会导致CPU占用过高降不下来,后来发现不是这样,导致cpu占用过高的是这段代码:
QColor c = QColor("#" + main_color);
c.setAlphaF(0.1);
QPalette palette;
palette.setColor(QPalette::Background,c);
setPalette(palette);
这是设置主题时改变窗口的背景色的代码。
这段代码一注释掉程序占用CPU马上变为0%。
改成重绘方式修改背景色就正常了:
backgroundColor = QColor("#"+main_color);
backgroundColor.setAlphaF(0.1);
void paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter p(this);
p.setPen(Qt::NoPen);
p.setBrush(backgroundColor);
p.drawRect(rect());
}
个人猜测在构造函数里用QPalette设置窗口背景色没问题,用QPalette修改已存在的窗口背景色才会有这种问题。