QT學習教程(三十七)

系統繁忙時的響應(Staying Responsive During Intensive Processing)

當我們調用QApplication::exec()時,Qt 就開始了事件循環。啟動時,Qt 發出顯示和繪制事件,把控件顯示出來。然后,事件循環就開始了,不停檢查是否有事件發生,然后把事件分派到程序中的QObject 對象。

一個事件正在處理時,其他的事件已經產生并加入到 Qt 的事件隊列中,如果我們在處理某一個事件時花費了很多事件,這期間用戶界面就不會有任何響應。例如,在程序保存文件時,窗口產生的事件就不會處理,只有在保存結束后才能處理。在保存的過程中,應用程序也不會處理窗口的繪制事件。解決這個問題的方法是多線程:一個線程處理用戶界面,另一個線程進行文件保存或者其他耗時的操作。這樣,程序的用戶界面就會在文件保存期間保持響應。在第 18 章會介紹這種方法。還有一個簡單的方法是在保存文件的過程中多次調用 QApplication::processEvents()。調用時Qt 就會處理暫停的事件,然后返回繼續保存文件。其實,QApplication::exec()也是一個調用processEvents()的while 循環。下面的例子是Spreadsheet 在保存文件時用 processEvents()響應用戶界面:

bool Spreadsheet::writeFile(const QString &fileName)
{
QFile file(fileName);
...
for (int row = 0; row < RowCount; ++row) {
for (int column = 0; column < ColumnCount; ++column) { QString str = formula(row, column);
if (!str.isEmpty())
out << quint16(row) << quint16(column) << str;
}
qApp->processEvents();
}
return true;
}

但是這樣做有一個危險,如果用戶在保存文件期間關閉了主窗口,或者又點擊了一次 File|Save

菜單,很容易造成死循環。解決的方法是把代碼 qApp->processEvents()用qApp->processEvents(QEventLoop::ExcludeUserInputEvents);代替,這樣,Qt 就會不處理鍵盤和鼠標事件。應用程序在進行長時間的操作時,經常使用 QProgressDialog,提示用戶正在進行的操作的完成情況。QProgressDialog 還提供了一個 Cancel 按鈕,允許用戶取消當前的操作。下面的代碼是Spreadsheet 保存文件時使用 QProgressDialog 的代碼:

bool Spreadsheet::writeFile(const QString &fileName)
{
QFile file(fileName);
...
QProgressDialog progress(this); progress.setLabelText(tr("Saving %1").arg(fileName)); progress.setRange(0, RowCount); progress.setModal(true);
for (int row = 0; row < RowCount; ++row) { progress.setValue(row);
qApp->processEvents();
if (progress.wasCanceled()) { file.remove();
return false;
}for (int column = 0; column < ColumnCount; ++column) { QString str = formula(row, column);
if (!str.isEmpty())
out << quint16(row) << quint16(column) << str;
}
}
return true;
}
  • 首先,創建一個QProgressDialog,設置NumRows 做為步驟的總數。然后,保存一行以后,調用setValue()更新進度條的狀態。QProgressDialog 根據當前步驟數和總步驟數自動計算完成的百分比。調用 QApplication::processEvents()處理可能發生的繪制事件,用戶點擊事件 ,或者鍵盤事件,如果用戶點擊了 Cancel 按鈕,則取消保存操作,刪除正在保存的文件。

我們沒有調用QProgressDialog 的show()函數,因為QProgressDialog 會自己處理。如果需要保存的文件很小,所需時間很短,QProgressDialog 能夠發覺這個情況,不顯示進度條。

除了使用多線程和QProgressDialog,還有一種完全不同的方法處理這種耗時較長的操作:在程序空閑時進行這類操作,而不是等待用戶的請求才做。但是程序空閑的時間無法預計,這種方法的條件是所進行的操作能夠安全中止和繼續。具體實現是,啟動一個 0 毫秒的計時器。只要程序中沒有其他須處理的事件,這個事件就會觸發。下面的 timeEvent()函數就是這個方法的實現:

void Spreadsheet::timerEvent(QTimerEvent *event)
{
if (event->timerId() == myTimerId) {
while (step < MaxStep && !qApp->hasPendingEvents()) { performStep(step);
++step;
}
} else {
QTableWidget::timerEvent(event);
}
}

如果hasPendingEvents()返回true,暫停操作,讓 Qt 控制程序運行。當Qt 沒有需要處理的事件時,操作繼續。

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

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

相關文章

hot100 -- 17.技巧

1.多數元素 問題&#xff1a; 給定一個大小為 n 的數組 nums &#xff0c;返回其中的多數元素。多數元素是指在數組中出現次數 大于 ? n/2 ? 的元素。 你可以假設數組是非空的&#xff0c;并且給定的數組總是存在多數元素。 方法1&#xff1a; 哈希表 實時判斷&#xff…

算法第39天| 打家劫舍 1、2、3

198. 打家劫舍 題目 思路與解法 class Solution { public:int rob(vector<int>& nums) {// dp數組含義&#xff1a;// 考慮下標i&#xff08;包括i&#xff09;以內的房屋&#xff0c;最多可以偷竊的金額為dp[i]if (nums.size() 0) return 0;if (nums.size() 1)…

車載CAN總線數據采集與故障診斷裝置設計與實現

車載CAN總線數據采集與故障診斷裝置設計與實現 鏈接:1.6W字 [下載]摘要1.1 研究背景1.2 研究意義(1)技術提升:推動CAN總線診斷的智能化與實時性(2)經濟價值:降低診斷成本與維修時間(3)安全與標準化:促進車聯網數據安全體系建設社會效益1.3 國內外研究現狀1.3.1 國外研…

布瑞琳BRANEW:高端洗護領航者,鑄就品質生活新典范

近日,布瑞琳BRANEW,這一中國高端洗護行業的領軍品牌,再次憑借其卓越的服務品質、創新的經營模式以及對行業標準的深度推動,成為市場矚目的焦點。作為北京2022年冬奧會和殘奧會的商業服務保障單位,布瑞琳不僅展現了其無與倫比的服務能力,更在國際舞臺上彰顯了品牌的非凡影響力。…

AWS服務器擴充硬盤

1、在控制臺上將需要擴充的硬盤增加空間 將硬盤大小由原來的50G升級到200G 2、登錄所掛載的服務器 1&#xff09;查看硬盤分區情況 adminip-172-31-121-13:~$ sudo lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS nvme0n1 259:0 0 200G 0 disk ├─nv…

嵌入式自學第四十二天

PWM:脈沖寬度調制&#xff0c;調節電壓為方波。關鍵參數&#xff1a;占空比、周期。 UART&#xff1a;通用異步收發器。 參與通信的設備&#xff1a;主機host 通信的本質&#xff1a;數據的傳遞。 通信方式&#xff1a; 單工&#xff1a;只能單向傳遞 半雙工&#xff1a;雙向…

人工智能如何重塑教育體系:個性化學習的新時代

&#x1f4dd;個人主頁&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 一、引言&#xff1a;教育的“智能革命”正在發生 教育作為人類社會發展的基石&#xff0c;始終緊隨技術進步不斷演化。從印刷術帶來知識…

【云原生】基礎篇

?一、云原生 1.1 本質與核心技術體系? 云原生&#xff08;Cloud Native&#xff09;是以容器化、微服務、聲明式API和動態編排為核心的架構范式&#xff0c;旨在最大化利用云的彈性、可觀測性和自動化能力。其技術棧分層如下&#xff1a; ?1.2、云原生核心技術棧? ?層級…

實時反欺詐:基于 Spring Boot 與 Flink 構建信用卡風控系統

在金融科技飛速發展的今天&#xff0c;信用卡欺詐手段日益高明和快速。傳統的基于批處理的事后分析模式已難以應對實時性要求極高的欺詐場景。本文將詳細介紹如何利用 Spring Boot 和 Apache Flink 這對強大的組合&#xff0c;構建一個高性能、可擴展的實時信用卡反欺詐系統。 …

通過apache共享文件

有時候&#xff0c;vmware虛擬機的vmware tools總是安裝失敗&#xff0c;這樣就不能在虛擬機和主機之間共享文件。此時可以利用apache通過文件上傳和下載共享文件。 通過下面的php文件&#xff0c;虛擬機作為客戶端訪問此php&#xff0c;可以在虛擬機和主機之間共享文件。當然…

Maven生命周期,測試

測試 Junit入門 單元測試 單元測試&#xff1a;就是針對最小的功能單元(方法)&#xff0c;編寫測試代碼對其正確性進行測試。 JUnit&#xff1a;最流行的Java測試框架之一&#xff0c;提供了一些功能&#xff0c;方便程序進行單元測試&#xff08;第三方公司提供&#xff09…

H5調試工具vconsole和Eruda對比

VConsole與Eruda對比分析 VConsole和Eruda是兩款主流的移動端JavaScript調試工具&#xff0c;它們在功能定位、使用場景和技術實現上有諸多差異。以下從多個維度進行對比&#xff0c;幫助你選擇更適合的工具&#xff1a; 一、核心功能對比 功能維度VConsoleEruda基礎日志輸出…

Java經典編程題

題目 1&#xff1a;斐波那契數列 題目要求&#xff1a;編寫一個方法&#xff0c;輸入正整數n&#xff0c;輸出斐波那契數列的第n項。斐波那契數列的定義是&#xff1a;F(0)0&#xff0c;F(1)1, 當n > 1時&#xff0c;F(n)F(n - 1)F(n - 2)。 答案&#xff1a; public cla…

BUG調試案例五十:“低級”設計BUG案例篇(持續更新中.........)

引言 回頭看這些年硬件路,總有一些“低級Bug”一次次地在給我上課。它們不是復雜的架構設計,不是玄妙的信號完整性問題,而是最基礎、最應該避免、卻又最容易忽略的小細節。 每一次Bug的背后,都是教訓,有的甚至讓整個項目差點“翻車”。寫下這篇文章記錄那些“看似簡單實…

DeepSeek中的提示庫及其用法示例

《DEEPSEEK原生應用與智能體開發實踐 圖書》【摘要 書評 試讀】- 京東圖書 為了深入探索DeepSeek提示詞樣例的豐富內涵&#xff0c;充分挖掘其背后潛藏的無限可能&#xff0c;同時致力于為用戶打造更為卓越、便捷且高效的使用體驗&#xff0c;DeepSeek官網的API文檔匠心獨運地…

Node.js特訓專欄-實戰進階:7.Express模板引擎選型與使用

&#x1f525; 歡迎來到 Node.js 實戰專欄&#xff01;在這里&#xff0c;每一行代碼都是解鎖高性能應用的鑰匙&#xff0c;讓我們一起開啟 Node.js 的奇妙開發之旅&#xff01; Node.js 特訓專欄主頁 專欄內容規劃詳情 Express模板引擎選型與使用全解析&#xff1a;打造動態We…

uniapp評價組件

組件目錄 components/Evaluation.vue <template><view class"evaluation-container"><!-- 綜合評價 --><view class"evaluation-item" tap"parentTap"><text class"label label-1">綜合評價</text&…

SQL Server2022版詳細安裝教程(Windows)

一&#xff0c;下載SQL Server 可以瀏覽器自己搜索一下 2、安裝 安裝前需要先將防火墻和帶殺毒軟件的先退出關閉掉&#xff08;防止安裝不成功&#xff09; 2.1、選擇自定義安裝 2.2、更改位置進行安裝 2.3、等待安裝 3、進行安裝配置 當安裝好后會彈出一個這樣的頁面 3.1、…

【圖像】ubuntu中圖像處理

一、環境設置 1、查看視頻源 ls /dev/video* 2、查看攝像頭的分辨率等參數 v4l2-ctl --device/dev/video0 --list-formats-ext 若未安裝v4l-utils sudo apt install v4l-utils 3、測試攝像頭能否正常工作 cheese

架構總結記錄

1、架構模型解決的共同問題 1.1、高內聚低耦合&#xff1a;解耦外部依賴&#xff0c;分離業務復雜度和技術復雜度等。 1.2、信息孤島和數據壁壘&#xff1a;單體架構垂直&#xff0c;沒有相互調用和復用。邏輯抽象、能力下沉、多系統復用問題 1.3、熵增 2、?單體架構與分布…