【Qt界面阻塞问题解决】

Qt界面阻塞问题解决

引言

在开发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);
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蛮v蛮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值