Qt中自定義控件的三種實現方式

Qt中自定義控件的三種實現方式

在 Qt 應用開發中,標準控件往往無法滿足所有需求。自定義控件允許開發者創建具有特定功能和外觀的控件,提高代碼復用性和界面一致性。Qt 提供了多種方式來開發自定義控件,從簡單的組合現有控件到完全自定義繪制。

1. 繼承現有控件并重寫(最常用)

適用場景:已有控件功能基本滿足,但需要添加行為或限制。

實現方式:繼承如 QLineEditQPushButton 等控件,重寫部分方法。

class MyCustomButton : public QPushButton {Q_OBJECT
public:explicit MyCustomButton(QWidget *parent = nullptr) : QPushButton(parent) {}protected:void paintEvent(QPaintEvent *event) override {Q_UNUSED(event);QPainter painter(this);// 自定義繪制邏輯painter.fillRect(rect(), Qt::red);painter.drawText(rect(), Qt::AlignCenter, text());}void mousePressEvent(QMouseEvent *event) override {// 自定義鼠標點擊處理emit customClicked();QPushButton::mousePressEvent(event); // 調用父類實現}signals:void customClicked();
};

2. 組合現有控件(復合控件)

將多個現有控件組合起來,形成一個新的功能更復雜的控件。通過一個容器控件管理多個子控件,并對外提供統一的接口。

適用場景:需要將多個簡單控件組合成一個功能單元,如自定義的日期選擇器、帶標簽的輸入框等。

實現要點

  • 通常繼承自QWidget作為容器
  • 在構造函數中創建并布局子控件
  • 提供統一的接口用于操作子控件
  • 可以將子控件的信號匯總或轉換為自定義信號
class SearchBox : public QWidget {Q_OBJECT
public:explicit SearchBox(QWidget *parent = nullptr) : QWidget(parent) {// 創建子控件m_lineEdit = new QLineEdit(this);m_button = new QPushButton("Search", this);// 設置布局QHBoxLayout *layout = new QHBoxLayout(this);layout->addWidget(m_lineEdit);layout->addWidget(m_button);// 連接信號槽connect(m_button, &QPushButton::clicked, this, &SearchBox::searchClicked);}QString getText() const {return m_lineEdit->text();}signals:void searchClicked();private:QLineEdit *m_lineEdit;QPushButton *m_button;
};

3. 完全自定義繪制(自繪控件)

直接繼承QWidgetQFrame,完全通過重寫paintEvent()函數實現所有繪制邏輯,不依賴任何現有控件。

適用場景:需要實現特殊外觀或行為的控件,如儀表盤、自定義圖表、音頻波形顯示等。

實現要點

通常繼承自QWidget

重寫paintEvent()實現所有繪制邏輯

重寫sizeHint()提供默認大小建議

重寫事件處理函數實現交互功能

可能需要使用QPainter進行復雜繪制

class DialGauge : public QWidget {Q_OBJECTQ_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged)
public:explicit DialGauge(QWidget *parent = nullptr) : QWidget(parent), m_value(0) {}int value() const { return m_value; }void setValue(int value) {if (m_value != value) {m_value = value;emit valueChanged(m_value);update(); // 觸發重繪}}QSize sizeHint() const override {return QSize(200, 200);}protected:void paintEvent(QPaintEvent *event) override {Q_UNUSED(event);QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);// 繪制背景painter.drawEllipse(rect().adjusted(10, 10, -10, -10));// 繪制指針painter.save();painter.translate(width()/2, height()/2);painter.rotate(m_value * 1.8); // 將0-100轉換為0-180度painter.drawLine(0, 0, 0, -height()/2 + 20);painter.restore();}signals:void valueChanged(int value);private:int m_value;
};

選擇建議

  • 如需簡單擴展現有控件功能,選擇第一種方式
  • 如需組合多個控件形成新控件,選擇第二種方式
  • 如需實現獨特外觀或復雜圖形,選擇第三種方式

參考文章:

1.Qt 自定義控件開發方法與實踐

2.QT中自定義控件的三種實現方式

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

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

相關文章

少兒舞蹈小程序(14)在線預約

目錄1 創建數據模型2 搭建預約按鈕3 搭建表單4 搭建管理功能整體效果總結目前我們的首頁已經開發完畢了,包含輪播圖、機構介紹、校區展示、作品與活動展示功能。家長在小程序了解了機構的基本情況之后,下一步就是參加試聽,在線下真實體驗一下…

TDengine 數據寫入詳細用戶手冊

TDengine 數據寫入用戶手冊 概述 TDengine 提供了多種靈活的數據寫入方式,以滿足不同應用場景的需求。本手冊將以智能電表場景為例,向初學者詳細介紹各種數據寫入方法的使用。 智能電表場景設定 假設我們需要為智能電表系統建立數據庫: …

PTA 天梯賽 7-43:字符串關鍵字的散列映射

【題目來源】 https://pintia.cn/problem-sets/15/exam/problems/type/7?problemSetProblemId890 【題目描述】 給定一系列由大寫英文字母組成的字符串關鍵字和素數 P,用移位法定義的散列函數 H(Key) 將關鍵字 Key 中的最后 3 個字符映射為整數,每個字…

Python核心技術開發指南(065)——with語句

版權聲明 本文原創作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl with語句定義 with語句是Python中用于簡化資源管理的語法結構,通過上下文管理器(實現__enter__()和__exit__()方法的對象)確保資源在使用完畢后被正確釋放,無論代碼塊是否發生異常。其核心作…

從基礎到高級:一文快速認識MySQL UPDATE 語句

在數據庫日常運維與開發中,數據更新是與數據查詢同等重要的核心操作。MySQL 的 UPDATE 語句憑借其靈活的語法結構和強大的功能,能夠滿足從簡單字段修改到復雜關聯表更新的各類需求。然而,若使用不當,不僅可能導致數據一致性問題&a…

材料基因組計劃(MGI)入門:高通量計算與數據管理最佳實踐

點擊 “AladdinEdu,同學們用得起的【H卡】算力平臺”,注冊即送-H卡級別算力,80G大顯存,按量計費,靈活彈性,頂級配置,學生更享專屬優惠。 摘要 材料基因組計劃(Materials Genome Ini…

Vision Transformer (ViT) :Transformer在computer vision領域的應用(一)

在圖像領域,CNN卷積神經網絡結構已經成為了標配,所有的模型都是基于CNN來構造的。 而在NLP領域,自從Transformer橫空出世之后,基本上也統治了NLP的各個領域。 基于Transformer的強大,一些論文的工作都是將Transformer也應用到CV領域,在這篇論文:AN IMAGE IS WORTH 16X1…

自動駕駛中的傳感器技術45——Radar(6)

本文詳細介紹4D雷達相關解決方案,4D雷達關鍵詞:4D Imaging Radar 1、4D雷達特點 圖1 4D雷達 vs 3D雷達圖2 4D雷達虛擬通道數量不斷增加圖3 4D雷達 vs 3D雷達 vs 攝像頭和激光雷達圖4 毫米波雷達在不同駕駛等級下的應用需求Ref:https://pdf.d…

瀏覽器調試工具詳解

個人簡介 👀個人主頁: 前端雜貨鋪 🙋?♂?學習方向: 主攻前端方向,正逐漸往全干發展 📃個人狀態: 研發工程師,現效力于中國工業軟件事業 🚀人生格言: 積跬步…

代碼審計-PHP專題原生開發SQL注入1day分析構造正則搜索語句執行監控功能定位

挖掘技巧: -語句監控-數據庫SQL監控排查可利用語句定向分析 -功能追蹤-功能點文件SQL執行代碼函數調用鏈追蹤 -正則搜索-(update|select|insert|delete|).*?where.* 如何快速的在多個文件代碼里面找脆弱: 1、看文件路徑 2、看代碼里面的變量&#…

Linux中:調試器gdb/cgdb的使用

引言在追尋光的路上不斷前行,詳細介紹Linux下gdb/cgdb的使用。一、準備? 程序的發布方式有兩種,默認是 debug 模式和 release 模式。Linux gcc/g編譯出來的二進制程序默認是release模式? 要使用gdb調試,必須在源代碼生成?進制程序的時候加…

【算法】【鏈表】148.排序鏈表--通俗講解

算法通俗講解推薦閱讀 【算法–鏈表】83.刪除排序鏈表中的重復元素–通俗講解 【算法–鏈表】刪除排序鏈表中的重復元素 II–通俗講解 【算法–鏈表】86.分割鏈表–通俗講解 【算法】92.翻轉鏈表Ⅱ–通俗講解 【算法–鏈表】109.有序鏈表轉換二叉搜索樹–通俗講解 【算法–鏈表…

計算機組成原理:存儲系統概述

📌目錄💾 存儲系統概述:計算機的“記憶中樞”🏗? 一、存儲系統的層次結構:速度與容量的“黃金平衡”(一)經典存儲層次金字塔(二)層次結構的設計原則(三&…

基于CNN/CRNN的漢字手寫體識別:從圖像到文字的智能解碼

在人工智能浪潮的推動下, handwriting recognition(手寫識別)技術已成為連接傳統書寫與數字世界的重要橋梁。其中,漢字手寫體識別因其字符集的龐大和結構的復雜性,被視為模式識別領域最具挑戰性的任務之一。近年來&…

【無人機】無人機用戶體驗測試策略詳細介紹

一、 道:核心測試理念與目標核心理念: 用戶體驗測試的核心不是尋找功能Bug,而是評估用戶在與無人機系統(包括飛行器、遙控器、APP)交互全過程中的主觀感受、操作效率、情感變化和達成目標的難易度。我們的目標是讓科技…

@RequiredArgsConstructor使用

spring推薦通過構造方法進行注入,如果需要注入的成員變量較多,手動創建構造方法可能需要頻繁修改,這時,可以使用RequiredArgsConstructor。RequiredArgsConstructor是lombok中提供的注解,可以為類中final或者NotNull修…

TA-VLA——將關節力矩反饋融入VLA中:無需外部力傳感器,即可完成汽車充電器插入(且可多次自主嘗試)

前言 今25年9.13日,我在微博上寫道: “我們為何24年起聚焦具身開發呢 23年我們做了一系列大模型應用,發覺卷飛了,c端搞不過大廠的工程迭代 流量獲取,b端拼不過大廠的品牌,且大廠外 人人都可以搞 ?然&…

數據驅動破局商業信息不對稱:中國商業查詢平臺的技術實踐與方法論心得

前言 在當前中國經濟高質量發展的浪潮中,企業數量已突破5000萬戶(截至2024年數據,延續2021年超5億用戶查詢需求的增長趨勢),但“企業質量參差、信息不透明”的痛點始終困擾著市場主體——企業合作前怕踩坑、個人求職擔心“皮包公司”、投資者規避壞賬風險,這些需求的核心…

光譜相機的圖像模式

光譜相機通過不同的成像方式獲取目標的光譜信息,主要分為以下幾種圖像模式:一、按成像方式分類?點掃描模式(Whiskbroom)?工作原理:逐點掃描目標區域,每個點獲取完整光譜曲線特點:光譜分辨率最…

連接器上的pin針和膠芯如何快速組裝?

在連接器生產過程中,pin 針與膠芯的組裝是核心環節 —— 人工組裝不僅效率低(單組耗時約 15-20 秒),還易因對齊偏差導致 pin 針彎曲、膠芯卡滯,不良率高達 3%-5%。針對這一問題,可通過 “機器精準排列 定制…