【QA】模板方法模式在Qt中有哪些應用?

在 Qt 框架中,模板方法模式(Template Method Pattern)被廣泛應用于框架的設計中,通過定義算法骨架并允許子類在不改變結構的情況下重寫部分步驟。以下是 Qt 中典型的應用場景及示例:

1. 事件處理(Event Handling)

Qt 的事件處理機制是模板方法模式的典型應用。基類(如QObjectQWidget)定義了事件處理的整體流程,子類通過重寫虛函數實現具體邏輯。

// 基類QObject中的事件處理骨架
bool QObject::event(QEvent *event) {switch (event->type()) {case QEvent::MouseButtonPress:return mousePressEvent(static_cast<QMouseEvent*>(event));case QEvent::KeyPress:return keyPressEvent(static_cast<QKeyEvent*>(event));// 其他事件類型...default:return false;}
}// 子類重寫具體事件處理
class MyWidget : public QWidget {
protected:void mousePressEvent(QMouseEvent *event) override {qDebug() << "Mouse pressed at" << event->pos();}
};

2. 繪制流程(Paint Event)

QWidgetpaintEvent方法定義了繪制的骨架,子類通過重寫paintEvent實現自定義繪制。

// 基類QWidget中的繪制流程
void QWidget::paintEvent(QPaintEvent *event) {QPainter painter(this);// 基類可能執行初始化或通用繪制drawBackground(&painter); // 基類可能提供默認實現drawContents(&painter);   // 子類需重寫的核心邏輯
}// 子類實現具體繪制
class MyWidget : public QWidget {
protected:void drawContents(QPainter *painter) override {painter->drawText(rect(), Qt::AlignCenter, "Hello Qt!");}
};

3. 模型 - 視圖架構(Model-View)

QAbstractItemModel作為模型的基類,定義了數據訪問的骨架,子類通過重寫虛函數提供具體實現。

// 基類QAbstractItemModel的骨架方法
int QAbstractItemModel::rowCount(const QModelIndex &parent = QModelIndex()) const {return 0; // 默認實現,子類需重寫
}QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const {return QVariant(); // 默認實現,子類需重寫
}// 子類實現具體數據模型
class MyModel : public QAbstractItemModel {
public:int rowCount(const QModelIndex &parent) const override {return 10; // 返回數據行數}QVariant data(const QModelIndex &index, int role) const override {if (role == Qt::DisplayRole)return QString("Item %1").arg(index.row());return QVariant();}
};

4. 對話框操作(Dialogs)

QDialogaccept()reject()方法定義了對話框關閉的骨架,子類可重寫這些方法執行自定義邏輯。

// 基類QDialog的默認實現
void QDialog::accept() {done(QDialog::Accepted); // 關閉對話框
}// 子類擴展關閉行為
class MyDialog : public QDialog {
public:void accept() override {// 執行自定義邏輯qDebug() << "Saving data before closing...";QDialog::accept(); // 調用基類關閉邏輯}
};

5. 網絡通信(Networking)

QTcpSocket的信號與槽機制中,數據讀取的流程由基類定義,子類通過重寫readyRead()等槽函數處理數據。

// 基類QTcpSocket的流程(偽代碼)
void QTcpSocket::processRead() {while (hasPendingData()) {readData(); // 基類讀取數據emit readyRead(); // 觸發信號}
}// 子類處理數據
class MySocket : public QTcpSocket {Q_OBJECT
public:void readyRead() override {QByteArray data = readAll();qDebug() << "Received:" << data;}
};

Qt 通過模板方法模式實現了框架的靈活性和可擴展性,開發者可通過子類化和重寫虛函數輕松擴展功能。典型場景包括事件處理、繪制、模型 - 視圖、對話框操作等。這種模式降低了代碼重復,同時保持了框架的統一結構。

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

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

相關文章

有趣的算法實踐:整數反轉與回文檢測(Java實現)

題目描述&#xff1a;整數反轉與回文檢測 要求實現兩個功能&#xff1a; 將輸入的整數反轉&#xff08;保留符號&#xff0c;如輸入-123返回-321&#xff09;判斷反轉后的數是否為回文數&#xff08;正反讀相同&#xff09; 示例&#xff1a; 輸入&#xff1a;123 → 反轉結…

【協作開發】低成本一鍵復刻github的gitea

在閱讀 next-public 時&#xff0c;反思原本的需求&#xff0c;是否本未倒置&#xff0c;故而重新調研當下開源現狀。發現 gitea 完全滿足商業軟件的開發要求&#xff0c;并且價格足夠低&#xff0c;使用足夠方便&#xff0c;其他同類軟件完全不用看了&#xff0c;真是世界級的…

基于“動手學強化學習”的知識點(二):第 15 章 模仿學習(gym版本 >= 0.26)

第 15 章 模仿學習&#xff08;gym版本 &#xff1e; 0.26&#xff09; 摘要 摘要 本系列知識點講解基于動手學強化學習中的內容進行詳細的疑難點分析&#xff01;具體內容請閱讀動手學強化學習&#xff01; 對應動手學強化學習——模仿學習 # -*- coding: utf-8 -*-import gy…

JAVA面試_進階部分_Java JVM:垃圾回收(GC 在什么時候,對什么東西,做了什么事情)

在什么時候&#xff1a; 首先需要知道&#xff0c;GC又分為minor GC 和 Full GC&#xff08;major GC&#xff09;。Java堆內存分為新生代和老年代&#xff0c;新生代 中又分為1個eden區和兩個Survior區域。 一般情況下&#xff0c;新創建的對象都會被分配到eden區&#xff…

2024年消費者權益數據分析

&#x1f4c5; 2024年315消費者權益數據分析 數據見&#xff1a;https://mp.weixin.qq.com/s/eV5GoionxhGpw7PunhOVnQ 一、引言 在數字化時代&#xff0c;消費者維權數據對于市場監管、商家誠信和行業發展具有重要價值。本文基于 2024年315平臺線上投訴數據&#xff0c;采用數…

設計模式Python版 訪問者模式

文章目錄 前言一、訪問者模式二、訪問者模式示例 前言 GOF設計模式分三大類&#xff1a; 創建型模式&#xff1a;關注對象的創建過程&#xff0c;包括單例模式、簡單工廠模式、工廠方法模式、抽象工廠模式、原型模式和建造者模式。結構型模式&#xff1a;關注類和對象之間的組…

安全無事故連續天數計算,python 時間工具的高效利用

安全天數計算&#xff0c;數據系統時間直取&#xff0c;安全標準高效便捷好用。 筆記模板由python腳本于2025-03-17 23:50:52創建&#xff0c;本篇筆記適合對python時間工具有研究欲的coder翻閱。 【學習的細節是歡悅的歷程】 博客的核心價值&#xff1a;在于輸出思考與經驗&am…

大型語言模型(LLM)部署中的內存消耗計算

在部署大型語言模型&#xff08;LLM&#xff09;時&#xff0c;顯存&#xff08;VRAM&#xff09;的合理規劃是決定模型能否高效運行的核心問題。本文將通過詳細的公式推導和示例計算&#xff0c;系統解析模型權重、鍵值緩存&#xff08;KV Cache&#xff09;、激活內存及額外開…

Mysql表的查詢

一&#xff1a;創建一個新的數據庫&#xff08;companydb),并查看數據庫。 二&#xff1a;使用該數據庫&#xff0c;并創建表worker。 mysql> use companydb;mysql> CREATE TABLE worker(-> 部門號 INT(11) NOT NULL,-> 職工號 INT(11) NOT NULL,-> 工作時間 D…

ASP.NET Webform和ASP.NET MVC 后臺開發 大概80%常用技術

本文涉及ASP.NET Webform和ASP.NET MVC 后臺開發大概80%技術 2019年以前對標 深圳22K左右 廣州18K左右 武漢16K左右 那么有人問了2019年以后的呢&#xff1f; 答&#xff1a;吉祥三寶。。。 So 想繼續看下文的 得有自己的獨立判斷能力。 C#.NET高級筆試題 架構 優化 性能提…

首頁性能優化

首頁性能提升是前端優化中的核心任務之一&#xff0c;因為首頁是用戶訪問的第一入口&#xff0c;其加載速度和交互體驗直接影響用戶的留存率和轉化率。 1. 性能瓶頸分析 在優化之前&#xff0c;首先需要通過工具分析首頁的性能瓶頸。常用的工具包括&#xff1a; Chrome DevTo…

一周學會Flask3 Python Web開發-SQLAlchemy刪除數據操作-班級模塊

鋒哥原創的Flask3 Python Web開發 Flask3視頻教程&#xff1a; 2025版 Flask3 Python web開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 首頁list.html里加上刪除鏈接&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta c…

改變一生的思維模型【12】笛卡爾思維模型

目錄 基本結構 警惕認知暗礁 案例分析應用 一、懷疑階段:破除慣性認知 二、解析階段:拆解問題為最小單元 三、整合階段:重構邏輯鏈條 四、檢驗階段:多維驗證解決方案 總結與啟示 笛卡爾說,唯獨自己的思考是可以相信的。 世界上所有的事情,都是值得被懷疑的,但是…

需求文檔(PRD,Product Requirement Document)的基本要求和案例參考:功能清單、流程圖、原型圖、邏輯能力和表達能力

文章目錄 引言I 需求文檔的基本要求結構清晰內容完整語言準確圖文結合版本管理II 需求文檔案例參考案例1:電商平臺“商品中心”功能需求(簡化版)案例2:教育類APP“記憶寶盒”非功能需求**案例3:軟件項目的功能需求模板3.1 功能需求III 需求文檔撰寫技巧1. **從核心邏輯出發…

五大方向全面對比 IoTDB 與 OpenTSDB

對比系列第三彈&#xff0c;詳解 IoTDB VS OpenTSDB&#xff01; 之前&#xff0c;我們已經深入探討了時序數據庫 Apache IoTDB 與 InfluxDB、Apache HBase 在架構設計、性能和功能方面等多個維度的區別。還沒看過的小伙伴可以點擊閱讀&#xff1a; Apache IoTDB vs InfluxDB 開…

Electron使用WebAssembly實現CRC-16 MAXIM校驗

Electron使用WebAssembly實現CRC-16 MAXIM校驗 將C/C語言代碼&#xff0c;經由WebAssembly編譯為庫函數&#xff0c;可以在JS語言環境進行調用。這里介紹在Electron工具環境使用WebAssembly調用CRC-16 MAXIM格式校驗的方式。 CRC-16 MAXIM校驗函數WebAssembly源文件 C語言實…

vue3vue-elementPlus-admin框架中form組件的upload寫法

dialog中write組件代碼 let ImageList reactive<UploadFile[]>([])const formSchema reactive<FormSchema[]>([{field: ImageFiles,label: 現場圖片,component: Upload,colProps: { span: 24 },componentProps: {limit: 5,action: PATH_URL /upload,headers: {…

Linux mount和SSD分區

為什么要用 mount&#xff1f; Linux 的文件系統結構是單一的樹狀層次 所有文件、目錄和設備都從根目錄 / 開始延伸。 外部的存儲設備&#xff08;如硬盤、U盤、網絡存儲&#xff09;或虛擬文件系統&#xff08;如 /proc、/sys&#xff09;必須通過掛載點“嫁接”到這棵樹上&a…

【Function】Azure Function通過托管身份或訪問令牌連接Azure SQL數據庫

【Function】Azure Function通過托管身份或訪問令牌連接Azure SQL數據庫 推薦超級課程: 本地離線DeepSeek AI方案部署實戰教程【完全版】Docker快速入門到精通Kubernetes入門到大師通關課AWS云服務快速入門實戰目錄 【Function】Azure Function通過托管身份或訪問令牌連接Azu…

舉例說明 牛頓法 Hessian 矩陣

矩陣求逆的方法及示例 目錄 矩陣求逆的方法及示例1. 伴隨矩陣法2. 初等行變換法矩陣逆的實際意義1. 求解線性方程組2. 線性變換的逆操作3. 數據分析和機器學習4. 優化問題牛頓法原理解釋舉例說明 牛頓法 Hessian 矩陣1. 伴隨矩陣法 原理:對于一個 n n n 階方陣 A A