问题:
客户端在运行一段时间后,出现了不明原因的界面全局或局部不刷新的现象,但是界面是可以操作的、最大化、最小化、拖拽窗体都没有任何卡顿,点击按钮也能够及时触发响应,只是按钮状态不会及时变更。最后排查出与ui的渲染有关系。
原因分析:
界面update()时属性Qt::WA_Mapped未被QMainWindow移除,而在显示窗口后,该属性没有再次设置。进而导致QWidgetBackingStore::sync中的if(discardSyncRequest(tlw,tlwExtra))条件不满足,dirtyWidgets没有被清除,因此系统UI全局或局部没有被渲染(paintEvent)。
解决方法:
1、在主界面接口类中重写虚函数showEvent
void MainWindow::showEvent(QShowEvent *event)
{
setAttribute(Qt::WA_Mapped);
QMainWindow::showEvent(event);
QSize oldSize = this->size();
resize(oldSize + QSize(10, 10));
resize(oldSize);
}
2、在主界面接口类中重写虚函数 changeEvent
void MainWindow::changeEvent(QEvent *event)
{
if(event->type() == QEvent::WindowStateChange)
{
if(!isMinimized())
{
setAttribute(Qt::WA_Mapped);
}
}
QWidget::changeEvent(event);
}