快速開發QCombox以及業務樣式自定義

来源:https://www.cnblogs.com/132818Creator/archive/2018/01/03/8185382.html
-Advertisement-
Play Games

這是我在項目實戰中的個人總結,寫的倉促,有些東西也不一定准確,有些是自己推斷的,還希望各位多多指教,多多評論。 關於QCombox如果不需要自定義,其實寫UI是很簡單的。 創建實例:QComboBox* m_pMicrophoneCombox = new QComboBox; 我是用的QSS去的寫樣 ...


 這是我在項目實戰中的個人總結,寫的倉促,有些東西也不一定准確,有些是自己推斷的,還希望各位多多指教,多多評論。

 關於QCombox如果不需要自定義,其實寫UI是很簡單的。

創建實例:QComboBox*  m_pMicrophoneCombox = new QComboBox;

我是用的QSS去的寫樣式,這裡用了一個命名函數:m_pMicrophoneCombox->setObjectName("DeviceCombox");

如果是用的setstylesheet直接在代碼里去寫就好了。

下麵說幾個屬性函數:

m_pMicrophoneCombox->setMaxVisibleItems(2);//最大可見區域為顯示兩條。

m_pMicrophoneCombox->setEditable(false); //設置QComboBox可編輯。

m_pMicrophoneCombox->setFocusPolicy(Qt::NoFocus);//設置QCombox沒有焦點。

m_pMicrophoneCombox->setLineEdit(edit);//edit是一個lineedit,就是說QCombox的LineEdit可以自定義,而QT的源碼中,頂端也是一個LineEdit。

m_pMicrophoneCombox->setCurrentIndex(0); // 設置當前選中的索引。

m_pMicrophoneCombox->setCurrentText(TR_TALK_DEVICE_COMBOX);//設置QCombox當前的顯示text,我是用巨集封裝的,滿足後期修改。

m_pMicrophoneCombox->setItemData(i, list[i]);//QCombox也可以自己傳入一個鏈表,並且自己定義索引,當然,你想傳一條數據,並且自己定義索引。

QListWidget* pListWidget = new QListWidget();//new一個widget的實例。

m_pMicrophoneCombox->setModel(pListWidget->model());//塞進widget的model。
m_pMicrophoneCombox->setView(pListWidget);//將widget裝進Combox。

m_pMicrophoneCombox->count();//用來計算combox下拉窗體的大小。

m_pMicrophoneCombox->addItems(list);//插入一個列表。

m_pMicrophoneCombox->addItem("111");//插入單條數據。

以上函數基本滿足業務要求,如果交互的樣式比較複雜,要求自定義樣式,這樣的話,我們就要自己去寫每一個item的樣式。

分析下QCombox的源碼,其實他的實現就是一個LineEdit和一個ListWidget,知道哦這個就可以自己去重新寫一個ListWidget。

Item *pItem = new Item(); //item是自己自定義寫的佈局,每一個item的自定義樣式就可以寫在這個裡面。
QListWidgetItem *pListWidgetItem = new QListWidgetItem(list[i],pListWidget);//我是將鏈表的數據塞進QCombox里。
pItem->setItemData(list[i]);//給每一個item塞進數據
pListWidget->setItemWidget(pListWidgetItem, pItem);//關於這個函數我的理解是:在底下一層上面再覆蓋一層。

然後在QSS的樣式里寫hover、pressed滑鼠事件,就有滑鼠的交互。

這種辦法雖然可行,但是數據不與UI分離,都攪在一團。

最佳的方案就是:

  既然QT的combox支持listwidget,那麼整體都用自己定製的listwidget。

 在itemwidget里寫佈局,自己搞一個delegate,在代理去管理UI,數據在model里去操作,這裡的model可能要自己封裝一層,滿足combox的交互要求。

pListWidget->m_pModel->Append(list[i]);//將每一個數據塞進model,剩下的數據操作就由model去管理。

特殊註意的是:這個時候,qt原生的那些介面都不生效了,例如:setcurrenttext還有setcurrentindex,查看源碼發現都是根據索引來操控,而事實上,我們用自己的model

去管理的數據,並不會生成一個索引來滿足combox管理的數據,所以這些對外的介面可能也要自己去封裝出來,可以說基本上是放棄了combox,自己去組裝LineEdit和ListWidget。

其實代碼量是很多的,公司業務可以去封裝成控制項,方便開發。

    最後,如果大神們有更好的辦法,歡迎評論。

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、前言 時間過得真是快,轉眼就2018年了。首先祝各位博友,軟體開發者新年新氣象,事業有成,身體健康,闔家幸福!最近看到園子里好多關於自己的2017年度總結以及對自己新一年的願景,覺得咱園子的氛圍是真的好。這三天假期我也沒閑著,一邊看OB海鮮團吃雞一邊寫Socket SocketAsyncEven ...
  • 並行演算法有可能非常複雜,並且或多或少涵蓋了這些並行集合。線程安全並不是沒有代價的。比起System.Collections和System.Collections.Generic命名空間中的經典列表 、集合和數組來說,併發集合會有更大的開銷,因此,應該只在需要從多個任務中併發訪問集合的時候才使用併發集... ...
  • 繼承,多態,封裝 在C#中,為了能夠合理描述自然界的規律,面向對象的編程引入了繼承的概念,是面向對象編程中最重要的概念之一,定義瞭如何根據現有的類創建新類的過程. 繼承:一個類派生出來的子類具有這個類所有的公共屬性和方法。 父類派生子類,子類繼承父類。 語法-- 子類:父類 子類和父類 被繼承的類稱 ...
  • .net連接操作SqlServer資料庫及最基本的增刪改查。 ...
  • 1. 前言 IValueConverter是用於數據綁定的強大的武器,它用於Value在Binding Source和Binding Target之間的轉換。本文將介紹IValueConverter的用法及一些常用的實現。 2. 為什麼要使用IValueConverter 假設有如下的類TestRe ...
  • 以下涉及到的所有資源都在這裡: 鏈接:https://pan.baidu.com/s/1eSctT5K 密碼:174s *我的VS2010的安裝位置:D:\Program Files (x86)\Microsoft Visual Studio 10.0 1.關於Glut的配置 1.1. 下載GLUT ...
  • Linux的root密碼破解不像Windows的密碼破解,windows的登錄密碼破解需要介入工具進行破解。Centos6和centos7的密碼方法也是不一樣的,具體如下: 首先是Centos 6的Root密碼破解 開機按esc 按 e 鍵進入編輯模式 選擇Kernel /vmlinz-2.6.32 ...
  • 上章分析了uboot啟動流程後,接下來便來配置新的單板,實現nor、nand啟動 1.首先在uboot里新建單板2440 1.1將2410的單板文件夾拷貝成2440: 然後將smdk2440下的smdk2410.c改為smdk2440.c,以及修改更改好的Makefile 1.2 將2410的頭文件 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...