1. 程式人生 > >Qt Style Sheet實踐(一):按鈕及關聯選單

Qt Style Sheet實踐(一):按鈕及關聯選單

http://www.cnblogs.com/csuftzzk/p/qss_button_menu.html

導讀

     正如web前端開發中CSS(Cascade Style Sheet)的作用一樣,Qt開發中也可以使用修改版的QSS將邏輯業務和使用者介面進行隔離。這樣,美工設計人員和邏輯實現者可以各司其職而不受干擾。更重要的是,由於介面和邏輯處理是分離的,低耦合性使得程式碼重構的工作量可以減少到最小。QSSCSS的語法幾乎一致,除了Qt自身增加的一些屬性之外,其餘的屬性都可以在CSS2或CSS3中找到對應的屬性。因此,如果曾經有過CSS的使用經驗,那麼QSS的使用將遊刃有餘。關於QSS的使用實踐,打算撰寫一系列部落格來記錄使用過程中的一些技巧和方法。本篇是系列第一篇,主要探討QPushButton

QMenu在QSS的作用下的效果。

QSS介紹

     QSS(QStyle Sheet)借鑑於CSS的良好思想,實現了介面和邏輯的分離。QSS中引入了盒模型(Box Model)概念,這是樣式表技術中的核心概念之一。具體的解釋網上說的挺多的,Qt本身自帶的文件也有較為詳細的說明。在使用盒模型進行設計之前,我們得了解下Qt中哪些元件可以用盒模型進行佈局設計:

Qt中可以應用盒模型的元件類
QCheckBoxQCheckBox的勾選符號可以使用::indicator子元件來定製。預設情況下,勾選標記位於元件矩形的左上角。QCheckBox的spacing屬性可以用於指定勾選標記和文字內容之間的間距。
QComboBox對於QComboBox而言,支援盒模型的其實是包裹QComboBox的外框(Frame),QComboBox的下拉單按鈕通過::drop-down子元件來定製,預設情況下下拉單按鈕位於盒模型中padding矩形的右上角。下拉按鈕中的箭頭號通過::down-arrow子元件進行定製,箭頭號預設位於子元件的正中央。
QGroupBoxQGroupBox的標題用::title子元件進行定製,標題的位置依QGroupBox::textAlignment的具體值而言。對於可選的QGroupBox而言,標題中還會包含一個勾選標記,勾選標記用::indicator來定製,spacing仍然用於設定勾選標記與文字的間距。
QSpinBox(QDateEdit,QDateTimeEdit)如圖所示,預設情況下spinbox右部分成上下兩個按鈕。以向上的箭頭為例,::up-button和::up-arrow分別用於定製按鈕及位於按鈕中的箭頭號。箭頭號預設位於按鈕的中間,對於向下的按鈕類似,只是用::down-button和::down-arrow子元件。
QToolBoxQToolBox是一個具備QQ摺疊功能的元件,因此其中的獨立的page使用::tab子元件定製。::tab元件支援一些偽狀態::only-one, :first, :middle, :previous-selected, :next-selected, :selected,從而達到定製特定page的目的。
QMenuBar選單欄元件的spacing屬性可指定選單項之間的間距,單個選單項還可以通過::item子元件定製風格。但是值得注意的是,由於MAC下選單欄整合到了系統選單欄,此時樣式表會失去作用。
QProgressBar進度條元件使用::chunks子元件來定製進度條樣式,text-align屬性用於設定進度條中文字的對齊方向:left, center, right
QScrollBar滾動條的組成其實非常複雜,依據垂直和水平方向的不同,由::handle, ::add-line, ::sub-line, ::add-page, ::sub-page, ::right-arrow,  ::left-arrow, ::down-arrow, ::up-arrow等子元件組成。偽狀態:horizontal, :vertical用於確定滾動條的方向,width(min-width), height(min-height)則可確定滾動條的不同長和寬。
QToolBar工具欄的偽狀態:top, :left, :right, :bottom的使用依賴於工具欄的具體位置;而:first, :last, :middle, :only-one則用於指代工具欄中的具體位置。工具欄的分隔器用::separator子元件指代,::handle則指代移動工具欄的handle.
QMenu選單中的獨立項使用::item子元件定製,除了常見的偽狀態,::item還支援:selected, :default, :exclusive以及:non-exclusive等偽狀態。利用這些偽狀態,可以為不同狀態的選單項定製出不同的外觀。對於可勾選的選單項,使用::indicator對勾選標記進行定製,::separator則定製選單項之間的分隔符;對於有子選單的選單項,其箭頭號可以用::right-arrow, ::left-arrow進行定製,還有::scroller及::tearoff兩個子元件,暫時沒搞清楚具體作用。
QLabelQLabel不支援:hover偽狀態,自Qt4.3開始,給QLabel設定樣式表也就隱式指定了QFrame::frameStyle屬性。
QLineEdit對於QLineEidt,selection-color, selection-background-color屬性分別指定了選中文字的文字顏色和背景色,lineedit-password-character屬性說明密碼輸入顯示的字元。將在後面的實踐中說明。
QPushButton支援:default, :flat, :checked偽狀態,對於具備關聯選單的按鈕,可以用::menu-indicator來定製下拉選單標記。而:open和:closed偽狀態則分別用於定製選單開啟和關閉時按鈕的外觀。
QRadioButton同上,::indicator用於定製文字前面的選項框,spacing指定文字與選項框之間的間距。
QSlider對於水平的QSlider,min-width和height屬性必須同時提供;對於垂直的QSlider, 必須同時提供min-height和width屬性。QSlider由::groove和::handle兩部分組成。::groove子元件是一條槽,供::handle在上面滑動。
QSplitter窗體分割器,主要的部件是::handle。通過::handle可以動態改變分割器中的不同子視窗大小。
QTextEdit使用selection-color, selection-background-color屬性定製,其他的定製方式見QAbstractScrollArea。
QToolButton如果QToolButton關聯了一個選單,那麼和QPushButton是相同的處理方式。如果被設定成了QToolButton::MenuButtonPopup模式,那麼::menu-button用於繪製選單按鈕,而::menu-arrow用於繪製按鈕中的箭頭號。注意:如果設定了QToolButton的背景色,那麼必須還要設定邊框的寬度才會起作用。這是因為QToolButton預設繪製的邊框會完全遮擋住使用者設定的背景色。
QAbstractScrollArea所有派生自QAbstractScrollArea類的子類,包括QTextEdit, QAbstractItemView,都可以通過設定background-attachment屬性來實現可滾動背景。通過給background-attachment設定fixed和scroll,背景會固定不動或者跟隨滾動。
QHeaderViewQHeaderView是Model/View框架中的一部分,最重要的子元件是::section,::section支援:middle, :first, :last, :only-one, :next-selected, :previous-selected, :selected, :checked等偽狀態。::up-arrow和::down-arrow用於定製表頭的排序標記。
QListView(QListWidget)show-decoration-selected屬性控制選中時是選中整項還是僅僅只是項的文字,其他和QTableView相同。
QTableView(QTableWidget)當view支援斑馬色條時,alternate-background-color屬性指定備選色實現斑馬色帶,selection-color和selection-background-color屬性指定選定項的文字色和背景色。注意:保證同時設定了背景色和邊框寬度值。
QTreeView(QTreeWidget)show-decoration-selected屬性控制選中時是選中整項還是僅僅只是項的文字, 子元件::branch和::item用於精細化控制。

應用例項

     下面看看如何用QSS對按鈕及其關聯選單進行外觀定製。我們首先用如下的程式碼初始化好按鈕及其關聯選單,並在Windows 7預設主題下看看其效果:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253ui.serviceType->setFixedWidth(95);m_mainMenu = new QMenu(this);m_osSubMenu = new QMenu(this);m_appSubMenu = new QMenu(this);m_details = new QAction(QStringLiteral("Details"),this);m_details->setCheckable(true);m_details->setChecked(true);m_settings = new QAction(QStringLiteral("Settings"), this);m_settings->setIcon(QIcon(":/misc/preference"));m_settings->setShortcut(QKeySequence::Print);m_os = new QAction(QStringLiteral("OS"), this);m_app = new QAction(QStringLiteral("Applications"), this);m_github = new QAction(QStringLiteral("Github"), this);m_github->setIcon(QIcon(":/app/github"));m_github->setShortcut(QKeySequence("Ctrl+G"));m_amazon = new QAction(QStringLiteral("Amazon"), this);m_amazon->setIcon(QIcon(":/app/amazon"));m_photoshop = new QAction(QStringLiteral("Photoshop"), this);m_photoshop->setIcon(QIcon(":/app/photoshop"));m_facebook = new QAction(QStringLiteral(

相關推薦

Qt Style Sheet實踐按鈕關聯選單

http://www.cnblogs.com/csuftzzk/p/qss_button_menu.html導讀     正如web前端開發中CSS(Cascade Style Sheet)的作用一樣,Qt開發中也可以使用修改版的QSS將邏輯業務和使用者介面進行隔離。這樣,美

Android ANR分析實踐北京×××搭建ANR是什麽、產生的原因如何避免ANR

例如 三種 handler 線程處理 不足 線程阻塞 種類 工具 input 一、 什麽是北京×××搭建 dsluntan.com VX:17061863513ANR ANR,(Application Not Responding) 即應用程序無響應,在android應

Webpack原理與實踐打包流程

寫在前面的話 在閱讀 webpack4.x 原始碼的過程中,參考了《深入淺出webpack》一書和眾多大神的文章,結合自己的一點體會,總結如下。 總述 webpack 就像一條生產線,要經過一系列處理流程後才能將原始檔轉換成輸出結果。 這條生產線上的每個處理流程的職責都是單一的,多個流程之間有存在依賴關

Choerodon豬齒魚敏捷管理實踐需求管理

本文是敏捷管理系列的第一篇,將介紹敏捷中重要的需求管理,涉及需求的獲取和管理,以及後續規劃問題。 ▌主要內容: 瀑布流開發模式弊端 敏捷需求管理 如何獲取需求 如何管理需求 史詩 使用者故事

ELK實踐基礎入門

雖然用了ELK很久了,但一直苦於沒有自己嘗試搭建過,所以想抽時間嘗試嘗試。原本打算按照教程 《ELK集中式日誌平臺之二 — 部署》(作者:樊浩柏科學院) 進行測試的,沒想到一路出了很多坑,所以又按照自己成功搭建的流程寫了本文。 《ELK集中式日誌平臺之二 — 部署》一文參考價值非常大,圖文並茂,大家可以在學

Spring Boot / Spring MVC 入門實踐 環境搭建與第一個專案

宣告 本系列文章系本人原創,歡迎轉載,轉載請註明出處。 本系列文章通過具體的例子,介紹如何通過Spring Boot來幫助簡化Spring MVC開發Web Application的過程,旨在通過具體的實踐,使讀者能夠入門利用Spring Boot開發Web

《深入理解Nginx》閱讀與實踐Nginx安裝配置與HelloWorld

#include <ngx_config.h> #include <ngx_core.h> #include <ngx_http.h> static char* ngx_http_mytest(ngx_conf_t *cf,ngx_command_t *cmd,

Mysql 實踐部署和安裝

1、 目標        解除安裝centos自帶的mysql       安裝mysql 5.6.33 2、步驟      1)  下載mysql,下載地址  http://dev.mysql.com/downloads/mysql/5.6.html#downloa

自動化測試最佳實踐從紡錘模型到金字塔模型

一、當前軟體開發的趨勢 開篇我們先簡要介紹一些近幾年在企業開發中出現的重要概念,以便引入持續測試的主旨。這些概念中最重要的兩個便是DevOps和微服務。兩者都是目前軟體開發中的最佳實踐和方法論,旨在為企業提供更高的靈活性,提升運營效率。 1.1 DevOps DevOps是一套實踐方法論和文化,提

ngrinder 壓力測試實踐 -- ngrinder介紹部署

ngrinder dockr ngrinder ngrinder 介紹 ngrinder 是一款操作簡單,功能強大的分布式壓力測試工具,其可以簡單快速的開始測試,也可以靈活根據實際需求設計場景完成壓力測試工作。 快速開始第一步:輸入待測地址 第二步:設定壓測參數 第三步:設定預約或立刻開始 第四

Veeam Backup & Replication試用安裝配置

近期veeam 9.5出來了,嘗試安裝使用,找到老管網路日誌相關的文件,分享一下。 轉自老管網路日誌http://guanjianfeng.com/archives/1159347   ===================================================

SmartGit 安裝使用安裝配置

一、官網下載smartgit安裝包。 https://www.syntevo.com/smartgit/download/ 二、安裝smartgit,根據提示安裝即可。 三、啟動配置smartgit。 1、選擇非商業模式安裝,勾選第三個Non-commercial us

SpringBoot簡明教程之Web檢視層WebJars靜態資源對映規則

SpringBoot簡明教程之檢視層(一):靜態資源對映規則及WebJars的使用 文章目錄 SpringBoot簡明教程之檢視層(一):靜態資源對映規則及WebJars的使用 專案建立 靜態資源對映規則 靜態資源對映

selenium模組介紹安裝

一、介紹 selenium最初是一個自動化測試工具,而爬蟲中使用它主要是為了解決requests無法直接執行JavaScript程式碼的問題。 selenium本質是通過驅動瀏覽器,完全模擬瀏覽器的操作,比如跳轉、輸入、點選、下拉等,來拿到網頁渲染之後的結果,可支援多種瀏覽器 f

Java類集框架簡介Collection介面

簡介 在實際專案中,涉及到儲存多個物件的操作往往會用到陣列。然而傳統的陣列存在一個問題:長度是固定的。Java 2提供了一個專門實現資料結構的開發框架——類集框架,框架的程式介面和類都儲存在java.util包中,其最為核心的用處就在於實現了動態物件陣列的操作,定義了大量的操作標準,核心

Kubernetes安裝架構功能說明

叢集功能各模組功能描述 Master節點: Master節點上面主要由四個模組組成,APIServer,schedule,controller-manager,etcd APIServer: APIServer負責對外提供RESTful的kubernetes API的服務,它是系統管理指令的統一

githubdesktop入門入門單人專案建立刪除

一、準備工作 1.1 註冊Github賬號 這個安裝包直接剪下掉,放到你想安裝到的資料夾裡就好,第一次執行他自己會搞定。 1.3 登陸並調整你的郵箱、名稱等 二、功能介紹 2.1建立倉庫 首先我們

指紋識別學習歷史疑問

        將指紋應用於身份驗證可以追溯到千年以前,犯人的畫押,地契,憑據均實行簽字畫押的形式,這就讓我想到指紋識別對的發展,那麼古人是怎麼進行指紋識別和筆跡鑑別的? 一、指紋識別可能應用的方法 1.  古代的手段,就是看指紋的形態,由此簡單反映到生活中的,就有所謂的”

使用javadoc生成api文件註釋標記

註釋及標記 一:常用註釋 //單行註釋; ---->一般用於描述單行的資訊 /** */多行註釋;---->一般使用者描述類或方法 二:嵌入HTML 註釋中嵌入HTML為了使後面生成api更加美觀。在/**與*/中間可以根據HTML語言任意設計api介

Scala 的那些奇怪的符號 “:” 作用用法

    Scala的語法很多,有些人認為過於繁瑣,有些人卻認為正是因為繁瑣,所以才讓這門語言嚴謹和強大。    例如在翻閱Scala資料或者檢視Scala原始碼的時候,經常會看到“<:”和“>:”,這是什麼鬼?下面我就來探討一下這兩個符號的用法: “<: