最近用qt做一个项目,在做多页面切换的时候发现会闪屏
我的页面切换主要是使用setCentralWidget和show来展示新页面,使用takeCentralWidget和hide来隐藏页面
1.setCentralWidget的坑
在setCentralWidget前,必须先takeCentralWidget,不然报读取位置时发生访问冲突(如下图)
2.多页面切换闪烁问题
思路就是在show出新页面之前,延迟hide旧页面。简单来说就是闪屏那一下实际发生原因是在把旧页面hide之后新页面还尚未show出来,所以对旧页面的hide操作在原本基础上进行延迟即可。
注:如果还使用了takeCentralWidget(),setCentralWidget()操作,这两个操作必须在show操作之前进行,不然依然无法解决闪屏。
this->takeCentralWidget(); //清除先前设置的中心窗口
this->setCentralWidget(pageOne); //设置页面1为中心窗口
pageOne->show(); //页面1显示
#pragma region 延迟隐藏以解决页面切换时的闪烁问题
QTime dieTime = QTime::currentTime().addMSecs(5);//5为延迟时间,可更改
while (QTime::currentTime() < dieTime)
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
#pragma endregion
pageTwo->hide(); //页面2隐藏
以下为我项目中实例代码供参考:
for (int i = 0; i < 3; i++)
{
connect(RTminiBar->miniBarRadioButtons[i], &QRadioButton::toggled, [=](bool state) {
if (state)
{
this->takeCentralWidget();
this->setCentralWidget(RTminiPages[i]);
RTminiPages[i]->show();
RTminiPagesShow(i); //页面显示后续处理(此处为个人项目中写的代码,不用管)
}
else
{
#pragma region 延迟隐藏以解决页面切换时的闪烁问题
QTime dieTime = QTime::currentTime().addMSecs(5);
while (QTime::currentTime() < dieTime)
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
#pragma endregion
RTminiPages[i]->hide();
RTminiPagesHide(i); //页面隐藏后续处理(此处为个人项目中写的代码,不用管)
}
});
}