Qt中解決UI線程阻塞導致彈窗無法顯示的兩種方法

在Qt應用程序開發中,我們經常會遇到這樣的問題:當執行一個耗時操作時,整個界面會卡住,無法響應任何用戶操作,甚至連一個簡單的提示彈窗都無法正常顯示。本文將介紹兩種解決這個問題的方法,并通過完整的代碼示例進行說明。

問題描述

先來看一個常見的錯誤示例:

#include <QMainWindow>
#include <QPushButton>
#include <QMessageBox>
#include <QVBoxLayout>
#include <QThread>class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr) : QMainWindow(parent){QWidget *centralWidget = new QWidget(this);setCentralWidget(centralWidget);QVBoxLayout *layout = new QVBoxLayout(centralWidget);QPushButton *button = new QPushButton("生成條碼", this);layout->addWidget(button);connect(button, &QPushButton::clicked, this, &MainWindow::onGenerateBarcodeClicked);}private slots:void onGenerateBarcodeClicked(){// 顯示提示對話框QMessageBox::information(this, "提示", "條碼生成中,請等待...");// 模擬耗時的條碼生成操作QThread::sleep(5); // 暫停5秒// 顯示完成對話框QMessageBox::information(this, "提示", "生成成功");}
};

這個代碼看起來很合理:點擊按鈕后,先顯示一個"條碼生成中"的提示框,然后執行條碼生成操作,最后顯示"生成成功"的提示。但實際運行時會發現,第一個提示框根本不會顯示,直到5秒后條碼生成完成,才會直接顯示"生成成功"的提示框。

這是因為Qt的UI是單線程的,所有UI更新都必須在主線程中進行。當執行QThread::sleep(5)時,整個主線程被阻塞,無法處理UI事件,包括繪制和顯示對話框。因此,第一個提示框雖然被創建了,但無法在屏幕上顯示出來。

方法一:使用QCoreApplication::processEvents()

第一種解決方法是在耗時操作中定期調用QCoreApplication::processEvents(),讓Qt有機會處理UI事件。

#include <QMainWindow>
#include <QPushButton>
#include <QMessageBox>
#include <QVBoxLayout>
#include <QThread>
#include <QProgressDialog>class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr) : QMainWindow(parent){QWidget *centralWidget = new QWidget(this);setCentralWidget(centralWidget);QVBoxLayout *layout = new 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80871.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80871.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80871.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025年中國DevOps工具選型指南:主流平臺能力橫向對比

在數字化轉型縱深發展的2025年&#xff0c;中國企業的DevOps工具選型呈現多元化態勢。本文從技術架構、合規適配、生態整合三個維度&#xff0c;對Gitee、阿里云效&#xff08;云效DevOps&#xff09;、GitLab CE&#xff08;中國版&#xff09;三大主流平臺進行客觀對比分析&a…

isp流程介紹(yuv格式階段)

一、前言介紹 前面兩章里面&#xff0c;已經分別講解了在Raw和Rgb域里面&#xff0c;ISP的相關算法流程&#xff0c;從前面文章里面可以看到&#xff0c;在Raw和Rgb域里面&#xff0c;很多ISP算法操作&#xff0c;更像是屬于sensor矯正或者說sensor標定操作。本質上來說&#x…

虛幻引擎5-Unreal Engine筆記之UE編輯器退出時的保存彈框

虛幻引擎5-Unreal Engine筆記之UE編輯器退出時的保存彈框 code review! 文章目錄 虛幻引擎5-Unreal Engine筆記之UE編輯器退出時的保存彈框1. 退出編輯器時彈出的“Save Content”窗口2. File 菜單中的保存選項3. 區別總結 1. 退出編輯器時彈出的“Save Content”窗口 退出時…

如何判斷IP是否被平臺標記

一、基礎檢測&#xff1a;連通性與黑名單篩查 網絡連通性測試 Ping與Traceroute&#xff1a;通過命令測試延遲和路由路徑&#xff0c;若延遲>50ms或存在異常節點&#xff08;如某跳延遲>200ms&#xff09;&#xff0c;可能影響可用性。示例命令&#xff1a; bash ping 8.…

零Gas授權實戰:用線下簽名玩轉智能合約 Permit 機制

目錄 鏈下簽名背景什么是 Permit ?鏈下簽名應用場景Permit 原理簡述實戰:從合約到前端完整實現安全注意事項總結鏈下簽名背景 在以太坊智能合約開發中,很多初學者經常面臨這樣一個問題:ERC20 代幣授權必須先調用鏈上合約的 approve(),再調用鏈上合約的 transferFrom(),每…

React 簡介:核心概念、組件化架構與聲明式編程

本文為《React Agent&#xff1a;從零開始構建 AI 智能體》專欄系列文章。 專欄地址&#xff1a;https://blog.csdn.net/suiyingy/category_12933485.html。項目地址&#xff1a;https://gitee.com/fgai/react-agent&#xff08;含完整代碼示?例與實戰源&#xff09;。完整介紹…

LeetCode100.7 接雨水

對于這題&#xff0c;有一個非常直觀簡潔的思路&#xff1a;水量等于柱子圍成的體積減去柱子的體積。 首先計算每一個高度的體積&#xff0c;相加即為總體積&#xff0c;減去sum(height)即為水的體積。 class Solution { public:int trap(vector<int>& height) {in…

NineData 社區版 V4.1.0 正式發布,新增 4 條遷移鏈路,本地化數據管理能力再升級

NineData 社區版 V4.1.0 正式更新發布。本次通過新增 4 條遷移鏈路擴展、國產數據庫深度適配、敏感數據保護增強?等升級&#xff0c;進一步鞏固了其作為高效、安全、易用的數據管理工具的定位。無論是開發測試、數據遷移&#xff0c;還是多環境的數據管理&#xff0c;NineData…

Go 語言 sqlx 庫使用:對 MySQL 增刪改查

MySQL 作為目前最流行的開源關系型數據庫&#xff0c;其 SQL 語法體系已形成行業標準&#xff0c;相關知識體系龐大且成熟&#xff0c;本文不再對 SQL 基礎進行詳細展開&#xff0c;建議尚未掌握的讀者先行系統學習。本文聚焦于如何使用 Go 語言進行 MySQL 數據庫操作&#xff…

單片機-STM32部分:13、PWM

飛書文檔https://x509p6c8to.feishu.cn/wiki/NjhuwbVP7iaEOikVK95cmJNLnWf PWM&#xff08;Pulse Width Modulation&#xff09;脈沖寬度調制&#xff0c;是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術。它是把每一脈沖寬度均相等的脈沖列作為PWM波形&am…

抽獎系統-獎品-活動

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言獲取獎品列表前端頁面活動創建需求分析活動創建后端實現1-控制層實現及校驗活動活動創建后端實現2-保存信息活動插入活動獎品插入 整合活動信息存入redis測試活…

Dense 與 MoE 系列模型架構的全面對比與應用策略

0. 簡介 人工智能領域正經歷著一場架構革命&#xff0c;從傳統的密集連接模型&#xff08;Dense&#xff09;向混合專家模型&#xff08;Mixture of Experts, MoE&#xff09;的轉變。本文將全面剖析這兩種模型架構的本質差異、各自優勢與挑戰&#xff0c;并提供戰略性的選擇框…

代碼隨想錄算法訓練營第四十天

LeetCode題目: 647. 回文子串516. 最長回文子序列 其他: 今日總結 往期打卡 647. 回文子串 跳轉: 647. 回文子串 學習: 代碼隨想錄公開講解 問題: 給你一個字符串 s &#xff0c;請你統計并返回這個字符串中 回文子串 的數目。 回文字符串 是正著讀和倒過來讀一樣的字符串。…

Supabase 的入門詳細介紹

Supabase 是什么&#xff1f; 簡單來說&#xff0c;Supabase 是一個開源的 Firebase 替代品。它提供了一整套后端即服務 (BaaS - Backend as a Service) 的工具&#xff0c;讓你能夠快速構建應用程序的后端&#xff0c;而無需自己從頭搭建和管理服務器、數據庫等基礎設施。 S…

【MySQL】mysql/bin目錄下程序介紹

&#x1f525;個人主頁&#xff1a; 中草藥 &#x1f525;專欄&#xff1a;【MySQL】探秘&#xff1a;數據庫世界的瑞士軍刀 MySQL在安裝完成后&#xff0c;通常會包含以下程序&#xff0c;以Ubuntu上的mysql為例&#xff0c;我們可以查看到 以下是常用的mysql程序 程序名作用…

IDEA+git將分支合并到主分支、IDEA合并分支

文章目錄 一、合并分支二、可能遇到的問題2.1、代碼沖突 開發過程中我們可能在開發分支(dev)中進行開發&#xff0c;等上線后將代碼合并到主分支(master)中&#xff0c;本文講解如何在IDEA中將dev分支的代碼合并到master分支中。 一、合并分支 功能說明&#xff1a;將dev分支的…

通過Ollama讀取模型

通過Ollama讀取模型 前言一、查看本地Ollama上有哪些模型二、調用bge-m3模型1、調用模型2、使用bge-m3進行相似度比較 三、調用大模型 前言 手動下載和加載大模型通常需要復雜的環境配置&#xff0c;而使用Ollama可以避免這一問題。本文將介紹如何調用Ollama上的模型。 一、查…

JS 中 Object.keys() 和 Object.values() 的深度解析與應用

文章目錄 前言一、Object.keys() 和 Object.values() 基礎1. Object.keys()2. Object.values() 二、與 Object.entries() 的對比三、實際應用場景1. 遍歷對象屬性2. 判斷對象是否為空3. 對象與數組的轉換4. 動態屬性操作5. 過濾對象屬性 總結 前言 在 JavaScript 開發中&#…

HCIP(BFD)

一、前言 隨著網絡應用的廣泛部署,網絡發生故障極大可能導致業務異常。為了減小鏈路、設備故障對業 務的影響,提高網絡的可靠性,網絡設備需要盡快檢測到與相鄰設備間的通信故障,以便及時采取措施,保證業務正常進行。BFD(Bidirectional Forwarding Detection,雙向轉發檢測)提供…

Webpack其他插件

安裝html打包插件 const path require(path); const HtmlWebpackPlugin require(html-webpack-plugin) module.exports {entry: path.resolve(__dirname,src/login/index.js),output: {path: path.resolve(__dirname, dist),filename: ./login/index.js,clean:true},Plugin:…