Qt6中模態與非模態對話框區別

一.阻塞 vs 非阻塞

1.模態對話框

阻塞父窗口:打開后,用戶必須先處理該對話框(關閉或完成操作),才能繼續操作父窗口。

應用場景:強制用戶立即響應的場景,如確認對話框、登錄窗口、文件選擇器等。

2.非模態對話框

不阻塞父窗口:打開后,用戶可同時與對話框和父窗口交互。

應用場景:需要長時間操作的工具窗口(如調色板、屬性編輯器)或提示信息(如通知氣泡)。

3.核心特性對比

二.模態對話框原理與應用

1. 工作原理

事件循環阻塞:調用 exec() 啟動局部事件循環

輸入獨占:禁用父窗口及其它窗口輸入

同步返回:對話框關閉后返回 QDialog::Accepted 或 Rejected

2.代碼示例

// 方式1: exec() - 阻塞模態

void MainWindow::showWindowModal()

{

????ParamSettingDialog *dlg = new ParamSettingDialog(this);

????dlg->setAttribute(Qt::WA_DeleteOnClose); // 關閉時自動刪除;不加入這句代碼會有內存泄漏

????connect(dlg, &ParamSettingDialog::accepted, this, &MainWindow::applySettings);

????dlg->exec(); ?// 阻塞模態

}

// 方式2: open() - 非阻塞但模態

void MainWindow::showWindowModal()

{

????ParamSettingDialog *dlg = new ParamSettingDialog(this);

????dlg->setAttribute(Qt::WA_DeleteOnClose); // 關閉時自動刪除

????connect(dlg, &ParamSettingDialog::accepted, this, &MainWindow::applySettings);

????dlg->open(); ?// 非阻塞但模態

}

3.內存管理問題

// 問題代碼 - 內存泄漏

void showDialog() {

????auto *dlg = new ParamSettingDialog();

????dlg->exec(); ?// 對話框關閉后指針未釋放

}

// 正確方案1: 關閉時自動刪除

void safeShowDialog() {

????auto *dlg = new ParamSettingDialog();

????dlg->setAttribute(Qt::WA_DeleteOnClose);

????dlg->exec(); ?// 對話框關閉后自動刪除

}

// 正確方案2: 棧上創建

void stackSafeDialog() {

????ParamSettingDialog dlg;

????dlg.exec(); ?// 自動銷毀

}

三.非模態對話框原理與應用

1.工作原理

異步顯示:show() 立即返回

共享事件循環:與主窗口共享同一事件隊列

并行交互:用戶可同時操作主窗口和對話框

2.創建方式

// 在類聲明中

class MainWindow : public QMainWindow {

????Q_OBJECT

private:

????ParamSettingDialog *m_paramDlg = nullptr; ?// 成員指針

};

// 顯示非模態對話框

void MainWindow::showModelessDialog()

{

????if (!m_paramDlg) {

????????m_paramDlg = new ParamSettingDialog(this); ?// 指定父對象

????????connect(m_paramDlg, &ParamSettingDialog::settingsChanged,

????????????????this, &MainWindow::updateSettings);

????}

????m_paramDlg->show(); ???// 顯示

????m_paramDlg->raise(); ??// 置于頂層

????m_paramDlg->activateWindow(); ?// 激活

}

3.內存管理策略

// 方案1: 父對象自動銷毀 (推薦)

m_dialog = new ParamSettingDialog(this); // 父對象析構時自動刪除

// 方案2: 關閉時自動刪除

m_dialog = new ParamSettingDialog();

m_dialog->setAttribute(Qt::WA_DeleteOnClose);

// 方案3: 手動管理

void MainWindow::closeEvent(QCloseEvent *event)

{

????if (m_dialog) {

????????m_dialog->close();

????????delete m_dialog;

????????m_dialog = nullptr;

????}

????QMainWindow::closeEvent(event);

}

四.內存管理黃金法則

棧優先原則:短生命周期對話框使用棧分配

父對象原則:長生命周期對話框設置父對象

自動刪除標志:setAttribute(Qt::WA_DeleteOnClose)

智能指針:C++17+ 使用 std::unique_ptr 管理

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

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

相關文章

處理Web請求路徑參數

目錄 1. 路徑變量(Path Variable) 2. 查詢參數(Query Parameter) 3. 表單參數(Form Data) 4. 請求體JSON參數(Request Body JSON) 5. 請求頭參數(Header Parameters&…

創客匠人:技術賦能下的創始人 IP 打造與內容創作新邏輯

在知識變現的浪潮中,創始人 IP 的核心競爭力始終圍繞內容展開,但內容創作的效率與質量往往成為瓶頸。創客匠人基于對行業的深刻洞察,探索出技術與內容融合的路徑,為創始人 IP 打造提供了新的思路 —— 不再將內容創作視為單純的輸…

Mysql分片:一致性哈希算法

一、一致性哈希的核心原理哈希取模最大的痛點是:當分片數量(例如數據庫節點數)發生變化時,幾乎所有數據的哈希結果都會改變,導致大規模的數據遷移。一致性哈希就是為了解決這個“伸縮性差”的問題而誕生的。核心思想&a…

前端學習 vben 之 axios interceptors

前端學習 vben 之 axios interceptors interceptor 攔截器,是一種軟件設計模式,核心思想就是在程序執行的特定階段(如請求發送前,響應返回后,方法調用前后等)自動插入自定義邏輯。實現對核心流程的“攔截”…

【java面試day4】redis緩存-數據持久化

文章目錄問題💬 Question 1相關知識問題 💬 Question 1 Q:redis作為緩存,數據的持久化是怎么做的? A:有兩種機制,一種是RDB,RDB會在指定的時間間隔內將內存中的數據生成快照,保存…

Vue3中element plus默認獲取最近一周和上個月的時間區間并在后端分開傳值

<el-form-item label"結算時間&#xff1a;" prop"datetimerangevalue"><el-date-pickerv-model"datetimerangevalue"value-format"YYYY-MM-DD HH:mm:ss"type"datetimerange"range-separator"至"start-p…

SQLAlchemy數據庫連接密碼特殊字符處理完全指南

引言 在使用SQLAlchemy連接數據庫時&#xff0c;我們通常使用URL格式指定連接信息&#xff0c;如mysqlpymysql://user:passwordhost:port/database。然而&#xff0c;當密碼中包含特殊字符&#xff08;如、#、$、!等&#xff09;時&#xff0c;會導致URL解析錯誤&#xff0c;進…

1.4 ARM安全參考架構(PSA Certified)

目錄1.4.1 PSA Certified概述1.4.2 PSA認證級別詳解1.4.3 PSA與TF-A的關系1.4.4 PSA安全模型實現信任根(RoT)架構關鍵安全服務&#xff1a;1.4.5 認證流程實踐1.4.6 典型應用案例參考資料1.4.1 PSA Certified概述 ARM Platform Security Architecture (PSA) Certified 是一套完…

企業網絡安全的“金字塔”策略:構建全方位防護體系的核心思路

在數字化轉型的浪潮中&#xff0c;企業的網絡安全已從單一的防護措施&#xff0c;發展成為多層次、全方位的安全體系。如何精準應對日益復雜的網絡威脅&#xff0c;成為眾多企業關注的焦點。本文將分享企業構建高效安全防護“金字塔”的核心思路。一、從“排查隱患”到“主動防…

爬蟲-request模塊使用

1.使用和安裝2.代碼測試打印返回的內容&#xff0c;默認是請求體中的標識.text 是打印源代碼設置一下編碼

HTML + CSS + JavaScript

目錄 1 HTML HTML 文件基本結構 HTML 開發工具 HTML 常見標簽 標題標簽&#xff1a;h1 - h6 段落標簽&#xff1a;p 換行標簽&#xff1a;br 圖片標簽&#xff1a;img 超鏈接標簽&#xff1a;a 表格標簽 表單標簽 form 標簽 input 標簽 select 標簽 textarea 標…

Java 與 MySQL 性能優化:MySQL連接池參數優化與性能提升

文章目錄引言一、連接池的基本概念與作用二、關鍵連接參數詳解2.1 max_connections2.2 wait_timeout2.3 interactive_timeout2.4 connect_timeout2.5 thread_cache_size三、連接池參數不合理導致的性能問題3.1 連接耗盡3.2 響應變慢3.3 連接失效3.4 資源浪費四、連接池參數優化…

浪潮CD1000-移動云電腦-RK3528芯片-2+32G-開啟ADB ROOT破解教程

浪潮CD1000-移動云電腦-RK3528芯片-232G-安卓9-開啟ADB ROOT破解教程破解教程&#xff1a;1.先下載好開心電視助手&#xff08;下載地址及其他版本&#xff1a;【工具大全】-【開心電視助手3.8&#xff0f;4.0&#xff0f;4.6&#xff0f;6.0&#xff0f;6.2&#xff0f;6.3&am…

【網絡編程】簡易的 p2p 模型,實現兩臺虛擬機之間的簡單點對點通信,并以小見大觀察 TCP 協議的具體運行

文章目錄基本概念業務拆解代碼實現準備工作實現被動的功能——多線程指針函數實現主動的功能——用戶選擇界面主函數代碼執行效果意外收獲總結推薦一個零聲教育學習教程&#xff0c;個人覺得老師講得不錯&#xff0c;分享給大家&#xff1a;[Linux&#xff0c;Nginx&#xff0c…

react狀態管理庫 - zustand

什么是zustand&#xff1f; zustand 是一個輕量級、快速且可擴展的 React 狀態管理庫&#xff0c;旨在提供一種簡單直接的方式來管理應用狀態&#xff0c;而無需其他解決方案通常伴隨的繁瑣代碼。根據官方 Zustand 文檔&#xff0c;Zustand 是“一個使用簡化 flux 原理的小型、…

粗排樣本架構升級:融合LTR特征提升模型性能的技術實踐

粗排樣本架構升級&#xff1a;融合LTR特征提升模型性能的技術實踐 ——基于PySpark的樣本構建與特征工程深度解析 一、粗排系統的定位與技術演進 在推薦系統級聯架構中&#xff0c;?粗排&#xff08;Rough Ranking&#xff09;?? 承擔著關鍵過渡角色&#xff1a;從召回層獲…

CCF-GESP 等級考試 2025年6月認證C++四級真題解析

1 單選題&#xff08;每題 2 分&#xff0c;共 30 分&#xff09;第1題 在C中&#xff0c;聲明一個指向整型變量的指針的正確語法是&#xff08; &#xff09;。A. int* ptr; B. *int ptr; C. int ptr*; D. ptr …

PlantUML 在 IDEA 中文版中的安裝與使用指南

目錄 摘要 一、安裝 PlantUML 插件 二、配置 PlantUML 運行環境 三、創建 PlantUML 文件 四、編寫 PlantUML 代碼 五、生成并查看圖表 六、自動生成類圖&#xff08;重點新增&#xff09; 6.1 從 Java 類生成類圖 6.2 類圖語法詳解 6.3 類圖高級技巧 七、常見問題及…

創客匠人:創始人 IP 打造中 “放下身段” 的深層邏輯

在 IP 經濟火熱的當下&#xff0c;無數創始人投身 IP 打造&#xff0c;卻鮮少有人意識到&#xff1a;真正能實現 IP 變現的核心&#xff0c;并非專業知識的堆砌&#xff0c;而是與用戶建立 “可交往” 的連接。創客匠人通過多年服務 IP 的實踐發現&#xff0c;那些穿越周期的創…

C語言<數據結構-鏈表>

鏈表是一種常見且重要的數據結構&#xff0c;在 C 語言中&#xff0c;它通過指針將一系列的節點連接起來&#xff0c;每個節點可以存儲不同類型的數據。相比數組&#xff0c;鏈表在插入和刪除元素時不需要移動大量數據&#xff0c;具有更好的靈活性&#xff0c;尤其適合處理動態…