当前位置: 首页 > news >正文

Qt同步处理业务并禁用按钮

1.界面+代码 

//按钮1
void Dialog::on_pushButton1_clicked()
{qDebug("pushButton1 clicked start");enableBtns(false);//禁用按钮qDebug("pushButton1 do sth start");QThread::sleep(5);//休眠,作为同步处理业务qDebug("pushButton1 do sth end");enableBtns(true);//启用按钮qDebug("pushButton1 clicked end");
}
//按钮2
void Dialog::on_pushButton2_clicked()
{qDebug("pushButton2 clicked start");enableBtns(false);//singleShot 延后处理业务。时间0ms不行QTimer::singleShot(1,this,[this](){qDebug("pushButton2 do sth start");QThread::sleep(5);qDebug("pushButton2 do sth end");enableBtns(true);});qDebug("pushButton2 clicked end");
}
//按钮3
void Dialog::on_pushButton3_clicked()
{qDebug("pushButton3 clicked start");enableBtns(false);//singleShot 延后处理业务。时间0ms不行QTimer::singleShot(1,this,[this](){qDebug("pushButton3 do sth start");QThread::sleep(5);qDebug("pushButton3 do sth end");//singleShot 延后启用按钮。时间 0或1不行,建议为5或10以上QTimer::singleShot(5,this,[this](){enableBtns(true);});});qDebug("pushButton3 clicked end");
}
//按钮其他
void Dialog::on_pushButtonOther_clicked()
{qDebug("pushButtonOther clicked");
}
//按钮禁用状态设置
void Dialog::enableBtns(bool enable)
{qDebug(enable?"enableBtns":"disableBtns");ui->pushButton1->setEnabled(enable);ui->pushButton2->setEnabled(enable);ui->pushButton3->setEnabled(enable);ui->pushButtonOther->setEnabled(enable);
}

2.测试

2.1点击 “按钮1”,然后立即点击“按钮其他”。按钮没变成禁用状态,“按钮其他”触发。

pushButton1 clicked start
disableBtns
pushButton1 do sth start
pushButton1 do sth end
enableBtns
pushButton1 clicked end
pushButtonOther clicked
pushButtonOther clicked

2.2点击 “按钮2”,按钮变成禁用状态,然后点击“按钮其他”,“按钮其他”仍触发。

pushButton2 clicked start
disableBtns
pushButton2 clicked end
pushButton2 do sth start
pushButton2 do sth end
enableBtns
pushButtonOther clicked
pushButtonOther clicked

2.2点击 “按钮3”,按钮变成禁用状态,然后点击“按钮其他”,“按钮其他”未触发。

pushButton3 clicked start
disableBtns
pushButton3 clicked end
pushButton3 do sth start
pushButton3 do sth end
enableBtns

3.原因分析

        Qt的界面刷新、按钮或QTimer::singleShot的业务处理都是放在主线程处理的。

        主线程处理按钮业务时,不会处理其他业务,界面也不会刷新。此时如果有其他事件,会将其他事件放在义务处理完。

        业务处理前禁用按钮,业务处理中就不会刷新界面样式;如果业务中点击过按钮,当业务处理完后有立即启用按钮,Qt框架会处理点击事件,判断按钮已经可用了,就会再次调用点击业务。

        QTimer::singleShot 可以将业务延后处理,使界面样式刷新,业务处理,点击事件判断 按预定顺序处理。

http://www.dtcms.com/a/336531.html

相关文章:

  • linux系统------kubenetes单机部署
  • LeetCode 分类刷题:2962. 统计最大元素出现至少 K 次的子数组
  • 5G虚拟仿真平台
  • [激光原理与应用-292]:理论 - 波动光学 - 驻波的本质是两列反向传播的相干波通过干涉形成的能量局域化分布
  • 安全多方计算(MPC)简述
  • Compose笔记(四十六)--Popup
  • Houdini 粒子学习笔记
  • 服装外贸管理软件 全流程优化解决方案
  • 学习记录(二十)-Overleaf如何插入参考文献
  • Chrome 插件开发实战:从入门到上架的全流程指南
  • 最长回文子串问题:Go语言实现及复杂度分析
  • 63.不同路径
  • Django前后端交互实现用户登录功能
  • 计算机网络---跳板机与堡垒机
  • Centos 更新/修改宝塔版本
  • 第七十八章:AI的“智能美食家”:输出图像风格偏移的定位方法——从“滤镜病”到“大师风范”!
  • 点云的PFH 和 FPFH特征
  • k8sday09
  • C# 反射和特性(自定义特性)
  • 股票术语:“支撑位”
  • 解码词嵌入向量的正负奥秘
  • 一张图总结 - AI代理上下文工程:构建Manus的经验教训
  • Python多线程、锁、多进程、异步编程
  • Linux | i.MX6ULL网络通信-套字节 TCP(第十七章)
  • 【k8s】Kubernetes核心概念与架构详解
  • 4.8 Vue 3: provide / inject 详解
  • LEA(Load Effective Address)指令
  • MACS2简介
  • 欠拟合和过拟合的特征标志,有什么方法解决,又该如何避免
  • 评测系统构建