引言
在开发Qt界面程序时,界面主线成网络需要加载界面一些资源,如果资源过大则会导致界面卡顿的现象。项目需要,本人也研究了好久,终于找到了解决方案,下面将其分享给大家。
解决思路
将界面主线的工作放在子线程里执行,摒弃大家熟知QThread、MoveThread等用法,采用了QtConcurrent将耗时资源移植子线程里运行,然后通过QFuture来获取执行结束,这样代码简洁明了。
核心代码展示
##耗时函数封装
首先将耗时相关代码,独立封装一个函数,当然支持传参和返回值,值得注意该部分程序,不要和主线界面UI对象挂钩,可以等该子线程执行结束后,将其构建界面添加至主线的对象里。
void MainWindow::function_needmoreTime()
{
int hPos=0;
for (int i = 0; i < 10000; i++){
if(i%1000==0){
QListWidgetItem* Item= new QListWidgetItem("hello");
mListItem.append(Item);
Item->setIcon(QIcon(":/error.png"));
hPos+=10;}
qDebug()<<i<<endl;}
}
##主线调用代码
调用代码如下所示,通过QtConcurrent将耗时任务分配给子线程完成,然后通过QFuture来监测完成情况,然后利用QApplication::processEvents来更新主界面,确保界面无卡顿,流畅丝滑。
void MainWindow::on_pushButton_clicked()
{
mLoad->onStart(); //开启进度条
QFuture<void> future = QtConcurrent::run(this,MainWindow::function_needmoreTime);//分配子线程运行
while(!future.isFinished())
{
QApplication::processEvents(QEventLoop::AllEvents, 100);//更新界面
}
mLoad->onClose();//关闭进度条
foreach ( QListWidgetItem* Item, mListItem){
ui->listWidget->addItem(Item);
}
}