快速開發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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...