QT:自定義ComboBox

實現效果:

實現combobox的下拉框區域與item區域分開做UI交互顯示。

支持4種實現效果,如下

效果一:

效果二:

效果三:

效果四:

實現邏輯:

ui由一個toolbutton和combobox上下組合成,重點在于combobox。

我設置了4種枚舉,ButtonWithComboBox對應效果一;OnlyButton對應效果四;OnlyComboBox對應效果三;OnlyComboBoxDepart對應效果二。

一、交互

自定義一個combobox,在鼠標事件中判斷鼠標處于哪個位置。將combobox分為2個部分,一個是item區,區域的獲取方法

QRect itemRect = style()->subControlRect(QStyle::CC_ComboBox, &opt,QStyle::SC_ComboBoxEditField);

一個是下拉按鈕區,獲取方法是

 _arrowRect = style()->subControlRect(QStyle::CC_ComboBox, &opt,QStyle::SC_ComboBoxArrow, this);

并設置一個變量用來記錄按鈕所在位置,這里,使用了setProperty,設置了一個參數名inArrowRect。當鼠標在item區時,inArrowRect為“out”,當鼠標在下拉按鈕區時,inArrowRect為“in”,當鼠標離開combobox時,inArrowRect為“null”。在css樣式表里結合inArrowRect的值設置交互。

二、自定義下拉區

在這里,我需要設置combobox支持下拉顯示自定義界面,所以我設置了一個變量_isCustomized,用來判斷下拉后是否使用自定義界面,如果使用自定義界面,只需要調用setPopupWidget(QWidget *widget),將自定義界面傳入。

此外,設置了一個變量_isTogether,用來判斷是否要將combobox的Item區與下拉按鈕區分開顯示,如果設置為false,那么會按原始的樣式顯示,兩者是整體;設置為true,樣式就會使用我上面顯示的。

因為常用的是自定義Menu,所以我封裝了一個函數QAction* addMenuAciton(QObject *obj,QString name,QString iconName,const QString &toolTip = "",bool isCheckable = false),專門用來顯示自定義Menu。

此外,就是有時候下拉區域是圖片帶文字的,點擊后,最終只顯示圖片或文字。所以這里要注意,我寫的這個類,下拉區域的顯示和combobox最終顯示的是獨立設置的2個。combobox顯示的內容是通過comboBox的addItem來添加。通過設置一個變量_comboType設置combobox顯示什么

實現代碼:

具體代碼實現如下

.cpp

#ifndef TOOLCOMBOBOX_H
#define TOOLCOMBOBOX_H#include <QWidget>
#include <QComboBox>
#include <QMouseEvent>
#include <QPainter>
#include <QVBoxLayout>
#include <QAbstractItemView>
#include <QStandardItem>
#include <QStylePainter>
#include <QStyleOptionComboBox>namespace Ui {
class ToolComboBox;
}
namespace RO_xxx{class IndependentComboBox : public QComboBox {Q_OBJECT
public:enum comboShow{iconAndText =0,onlyText =1,onlyIcon=2};Q_ENUM(comboShow)using QComboBox::QComboBox;void setComboShow(comboShow type){_comboType = type;}void setPopupWidget(QWidget *widget){_customPopup = widget;_customPopup->setWindowFlag(Qt::Popup);// 設置為 Popup 類型// 確保 Popup 關閉時能正確觸發 hidePopup()connect(_customPopup, &QWidget::destroyed, this, &QComboBox::hidePopup);}void setTogether(bool together){_isTogether = together;}void setComboBoxPopCustomized(bool isCustomized){_isCusto

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

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

相關文章

VS2022+OpenCasCade配置編譯

一、Open CASCADE Technology介紹及安裝&#xff08;windows10&#xff09; Open CASCADE Technology&#xff08;簡稱OCCT&#xff09;是一款開源的 3D CAD/CAM/CAE 軟件開發平臺&#xff0c;廣泛應用于工業設計、工程仿真、制造等領域。開源OCC對象庫是一個面向對象C類庫&…

【OSG學習筆記】Day 12: 回調機制——動態更新場景

UpdateCallback 在OpenSceneGraph&#xff08;OSG&#xff09;里&#xff0c;UpdateCallback是用來動態更新場景的關鍵機制。 借助UpdateCallback&#xff0c;你能夠實現節點的動畫效果&#xff0c;像旋轉、位移等。 NodeCallback osg::NodeCallback 是一個更通用的回調類&…

全新升級:BRAV-7601-T003高性能無風扇AI邊緣計算系統,助力智能未來!

在數字化與智能化飛速發展的今天&#xff0c;AI邊緣計算正成為各行各業的核心驅動力。BRAV-7601作為一款高性能無風扇AI邊緣計算系統&#xff0c;憑借其強大的硬件配置與豐富的擴展能力&#xff0c;為車路協同、特種車輛車載、機器視覺、醫療影像等領域提供了卓越的解決方案。最…

刪除 Git 遠程記錄并重新設置

刪除 Git 遠程記錄并重新設置 以下是在 Windows 平臺上刪除當前項目的 Git 遠程記錄并重新設置遠程存儲庫的步驟&#xff1a; 步驟一&#xff1a;查看當前遠程倉庫 首先&#xff0c;檢查當前設置的遠程倉庫&#xff1a; git remote -v這會顯示所有已配置的遠程倉庫及其 URL…

有哪些和PPT自動生成有關的MCP項目?

隨著AI技術的快速發展, Model Context Protocol(MCP) 作為一種連接大型語言模型(LLMs)與外部工具的開放協議,正在重塑自動化辦公領域。在PPT自動生成場景中,MCP通過標準化接口實現了AI模型與設計工具、數據源的無縫整合。以下從技術框架、項目案例、應用場景三個維度展開…

PostgreSQL psql 命令和常用的 SQL 語句整理

PostgreSQL psql 命令和常用的 SQL 語句整理 1、登錄PostgreSQL數據庫2、psql 命令3、數據庫操作4、模式操作5、表操作6、數據操作7、索引操作8、視圖操作9、權限操作 1、登錄PostgreSQL數據庫 在系統的命令行界面&#xff08;如 Windows 的 cmd 或者 PowerShell、Linux 的終端…

【unity游戲開發入門到精通——UGUI】文本輸入控件 —— InputField舊控件

注意&#xff1a;考慮到UGUI的內容比較多&#xff0c;我將UGUI的內容分開&#xff0c;并全部整合放在【unity游戲開發——UGUI】專欄里&#xff0c;感興趣的小伙伴可以前往逐一查看學習。 文章目錄 前言1、文本輸入控件2、InputField舊文本輸入控件組成 一、InputField文本輸入…

獲得ecovadis徽章資格標準是什么?ecovadis評估失敗的風險

EcoVadis徽章資格標準 EcoVadis徽章是對企業在可持續發展&#xff08;環境、勞工與人權、商業道德、可持續采購&#xff09;方面表現的認可。獲得徽章需滿足以下條件&#xff1a; 完成評估&#xff1a; 企業必須完成EcoVadis的問卷評估&#xff0c;并提交所有必要文件。 評分…

Python初學 有差異的知識點總結(一)

目錄 一、基礎語法規則 1.注釋 2.代碼編寫 二、基礎語法 1.變量 2.數據類型 3.數據類型的轉換 &#xff08;1&#xff09;隱式轉換 &#xff08;2&#xff09;顯示轉換 4.標識符 5.運算符 6.字符串 &#xff08;1&#xff09;定義 &#xff08;2&#xff09;拼接 …

Java面試場景深度解析

Java面試場景深度解析 在互聯網大廠Java求職者的面試中&#xff0c;經常會被問到關于Java項目中的各種技術場景題。本文通過一個故事場景來展示這些問題的實際解決方案。 第一輪提問 面試官&#xff1a;馬架構&#xff0c;歡迎來到我們公司的面試現場。請問您對Java內存模型…

【數據可視化藝術·應用篇】三維管線分析如何重構城市“生命線“管理?

在智慧城市、能源管理、工業4.0等領域的快速發展中&#xff0c;地下管線、工業管道、電力通信網絡等“城市血管”的復雜性呈指數級增長。傳統二維管理模式已難以應對跨層級、多維度、動態變化的管線管理需求。三維管線分析技術應運而生&#xff0c;成為破解這一難題的核心工具。…

Spring-全面詳解(學習總結)

一&#xff1a;概述 1.1 為什么學 解決了兩個主要問題 1. 2 學什么 1.3 怎么學 二&#xff1a;系統架構 作用&#xff1a;web開發、微服務開發、分布式系統開發 容器&#xff1a;用于管理對象 AOP:面向切面編程&#xff08;不驚動原始程序下對其進行加強&#xff09; 事…

企業架構之旅(2):解鎖TOGAF ADM

文章目錄 一、什么是 TOGAF ADM二、TOGAF ADM 的關鍵階段架構愿景&#xff08;Phase A&#xff09;業務架構&#xff08;Phase B&#xff09;信息系統架構&#xff08;Phase C&#xff09;技術架構&#xff08;Phase D&#xff09;機會與解決方案&#xff08;Phase E&#xff0…

MySQL 中 SQL 語句的詳細執行過程

MySQL 中 SQL 語句的詳細執行過程 當一條 SQL 語句在 MySQL 中執行時&#xff0c;它會經歷多個階段的處理。下面我將詳細描述整個執行流程&#xff1a; 1. 連接階段 (Connection) 客戶端與 MySQL 服務器建立連接服務器驗證用戶名、密碼和權限連接器負責管理連接狀態和權限驗…

ETL架構、數據建模及性能優化實踐

ETL&#xff08;Extract, Transform, Load&#xff09;和數據建模是構建高性能數據倉庫的核心環節。下面從架構設計、詳細設計、數據建模方法和最佳實踐等方面系統闡述如何優化性能。 一、ETL架構設計優化 1. 分層架構設計 核心分層&#xff1a; 數據源層&#xff1a;對接O…

快速上手Prism WPF 工程

1、Prism 介紹 ?定位?&#xff1a; Prism 是 ?微軟推出的框架&#xff0c;專為構建 ?模塊化、可維護的復合式應用程序? 設計&#xff0c;主要支持 WPF、Xamarin.Forms、UWP 等平臺。?核心功能?&#xff1a; ?模塊化開發?&#xff1a;將應用拆分為獨立模塊&#xff0c…

React 單一職責原則:優化組件設計與提高可維護性

單一職責原則&#xff08;SRP&#xff09; 在 React 中&#xff0c;組件是構建 UI 的核心單位&#xff0c;而良好的組件設計是保證應用質量和可維護性的關鍵。單一職責原則是一種設計原則&#xff0c;也適用于 React 組件的開發。它強調每個組件應該只關注一個職責&#xff0c…

css網格布局Grid

一、網格布局適應場景 當涉及到的布局是二維布局&#xff08;元素不止一行或者一列&#xff09;且比較復雜的時候&#xff0c;可以用網格布局&#xff0c;看下面的一個例子&#xff1a; 上圖上一個四行三列的網格&#xff0c;布局相對比較復雜。如果你用別的布局方案&#xff…

利用Python生成Xilinx FPGA ROM IP核 .coe初始化文件

以下是一個 Python 腳本&#xff0c;用于生成 Xilinx IP ROM 的.coe 格式初始化文件&#xff0c;假設ROM 深度為 1024&#xff0c;數據位寬為 32bit&#xff0c;使用隨機的 32 位無符號數進行初始化&#xff1a; import random# 定義ROM的深度和數據位寬 rom_depth 1024 data…

8.2 段落格式

在word里&#xff0c;段落格式包括首行縮進、行間距、段前、段后等。LaTex同樣支持這些功能。 段落間距 全局設置 段落間距用setlength命令來指定。如以下代碼 \documentclass{article} \usepackage{ctex} \begin{document}\setlength{\parskip}{11em plus 1em minus 1em}\p…