Qt执行耗时操作导致界面卡顿的三种解决办法

您所在的位置:网站首页 omsystemom5操作回主界面 Qt执行耗时操作导致界面卡顿的三种解决办法

Qt执行耗时操作导致界面卡顿的三种解决办法

2024-07-09 14:25| 来源: 网络整理| 查看: 265

1.问题描述

Qt界面程序开发中,会遇到执行耗时操作时,导致界面卡顿。原因是界面主线程是单线程,如果在UI主线程中执行耗时操作,例如点击按钮,响应函数去数据库查询数据,数据量比较大时,查询需要几秒钟甚至几十秒的时间,如果UI主线程一直等待响应函数返回,阻塞在响应函数内部,就无法响应界面的其他消息或者事件,界面就会卡死,无响应;

2.解决方法

(1)用Qt::QueuedConnection去连接信号槽

Qt::QueuedConnection是用队列的形式执行操作,点击pushButtonStart按钮之后,会立刻返回,不用等到startSmartApart();执行完成再返回;startSmartApart();5秒内执行完,可以考虑这种方法,超过5秒,界面也会卡顿;

connect(ui.pushButtonStart, &QPushButton::clicked, this, [=]() { //QtConcurrent::run(this, &test::startSmartApart); startSmartApart(); },Qt::QueuedConnection);

(2)用QtConcurrent::run将类函数放入线程中执行;

(1)QtConcurrent::run会创建一个新的线程,将类函数放入新的线程中执行;也可以返回返回值; connect(ui.pushButtonStart, &QPushButton::clicked, this, [=]() { QtConcurrent::run(this, &test::startSmartApart); //startSmartApart(); },Qt::QueuedConnection); (2)可以给执行的类函数startSmartApartCount(int count)传入多个参数,最多5个参数; connect(ui.pushButtonStart, &QPushButton::clicked, this, [=]() { //QtConcurrent::run(this, &test::startSmartApart); int retval = -1; QtConcurrent::run(this, &test::startSmartApartCount,100); //startSmartApart(); },Qt::QueuedConnection); (3)同步方法获取函数的返回值,但是 future.waitForFinished();会阻塞主线程等待结果返回,导致界面卡死; connect(ui.pushButtonStart, &QPushButton::clicked, this, [=]() { int retval = -1; QFuture future = QtConcurrent::run(this, &test::startSmartApartCount, 10); future.waitForFinished();//阻塞等待结果返回 qDebug()


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3