讓你的Qt桌面程式看上去更加native(二):Style

科技小能手發表於2017-11-15

我們先從 Style 說起。所謂 Style,也就是風格。可以理解成把程式一執行起來,第一眼看上去的的樣子,也就是程式的第一印象。這種第一印象往往左右著使用者的想法。例如,safari 原本是 Apple 在 MacOS 下的一款瀏覽器。後來,Apple 把它移植到 Windows 平臺,但仍舊保留了 Apple 的外觀。這樣一來,儘管 safari 看起來很華麗,卻與 Windows 的風格格格不入(下圖出自 http://www.dtgeeks.com/journals/article/safari_for_windows/):

我們不能簡單說這是 Apple 的設計失敗之處。但是,如果你自己的程式留給使用者的第一印象是這種樣子的話,不知道使用者能不能很好的接受呢?比如,你見過有幾個 Windows 下的程式會把 title 放到標題欄的居中位置?這分明就是 Apple 的風格。在本文中,我們正是要避免出現這種情況。

這就是 Style,使用者的第一印象。下面我們來看看 Qt 的表現:

上面是我在 Windows XP 下使用 designer 拖畫出來的介面,然後原封不動拿到 Ubuntu 下編譯出來的結果。我們很容易的看出哪一個是 XP 下的視窗,哪一個是 Ubuntu 下的視窗。在 Ubuntu 下,除了大小有問題之外,其他元件同系統很好的融合在一起。並且注意一下細節:Windows 下,OK 在 Cancel 前面,而 Ubuntu 下,OK 則在 Cancel 後面。使用 QDialogButtonBox,Qt 就已經能夠為我們處理好這種細節,完全不需要我們自己考慮這種事情。

Qt 實際使用 QStyle 這個類來實現各個不同平臺特有的行為。QStyle 主要完成的工作是,給出一個合適的系統外觀;確定元件的大小和形狀(例如上面的水平滑塊的樣式)。在這裡,我們的建議是,不要強制指定一套風格。如果你需要手動編譯 Qt,記得加上所需要的標頭檔案,例如在 X11 平臺下連結到 GTK+ 的庫,而在 Windows 平臺下 連結到 Windows SDK。另外,在編寫自定義元件時,注意使用系統元件而不是自己用圖片替代。先看下面兩張截圖(來自 Nokia 2009 開發者大會 PPT):

這兩個相當熟悉的介面來自同一個程式:QtCreator。你能夠分辨出它們分別來自什麼平臺嗎?如果熟悉的話,我們可以很明顯地從滾動條認出,第一個來自 Windows 平臺,確切的說是 Windows Vista 或者 Windows 7;而第二個來自 MacOS。這是 Qt 為我們實現的,不是我們的重點。重點是細節:不同平臺下,程式碼摺疊的樣式是不同的。這裡只是為了強調一點:不要試圖用圖片來顯示這種通用的元件。這裡的程式碼摺疊其實使用 tree 實現的,而 Windows,MacOS 下 tree 的圖示顯然是不同的。我們應該遵循系統約定,Windows 下的摺疊起來的圖示是 白色的,而 MacOS 下則是同展開時一樣的灰色。那麼,如何實現這一點呢?下面是關鍵程式碼:

;.=;.=::|::;if() {.|=::;}

style()->drawPrimitive(QStyle::PE_IndicatorBranch, &opt, painer, this);

本文轉自 FinderCheng 51CTO部落格,原文連結:
http://blog.51cto.com/devbean/457349



相關文章