#PYTHON3 #QT #PYSISE2 #TUTORIAL #COLOR #FONT

PySide #11: 讓世界變成你喜歡的顏色, QColor, QColorDialog, QPalette

給你一點顏色瞧瞧!

DekBan
Bucketing

--

Photo by Paweł Czerwiński on Unsplash

文字雖然能表達事物的內涵,卻很難帶給人們外觀上的驚嘆,但顏色可以!而正體字的外觀讓人感覺不到溫暖,因此有了藝術字體,帶給人們更多視覺觀感上的享受。但…我們能自己決定樣式與顏色嗎? 在Qt中,當然可以!

QColor

說到顏色,Qt中已有內建的類型可以使用,使用上也非常方便,色彩上有許多格式,如RGB, CMYK, HSV等等,而QColor可以讓我們很方便的在這些格式之間作轉換。

Declare

# set color
a_color = QColor('#55aa55')
b_color = QColor(qRgb(125, 22, 100))
c_color = QColor("black")

print(a_color.name())
print(b_color.name())
print(c_color.name())
======= out put =======
#55aa55
#7d1664
#000000

Format Switching

a_cmyk = a_color.toCmyk()
print(a_cmyk)
======= out put =======
PySide2.QtGui.QColor.fromCmykF(0.500008, 0.000000, 0.500008, 0.333333, 1.000000)

QColorDialog

Qt又提供許多方便的組合功能,以彈跳視窗的方式給予使用者不同的協助,QColorDialog就是其中一種,也就是我們在小畫家、PS中常見的調色盤或是顏色選擇器。

使用上也非常方便,一個函式即可搞定。

from PySide2.QtWidget import QColorDialog# Set it as the slot of the button
@QtCore.Slot()
def choose_color(self):
color_dialog = QColorDialog()
color = color_dialog.getColor()
color_name = color.name()
# Output the color hex name
self._window.output_text.append(color_name)

Result

QColorDialog sample

QPalette

介紹完顏色的類別、型態轉換、顏色的取得方式,接下來就到了重頭戲啦!
那就是Palette!這是個一般人比較少碰觸到的東西,因為這一修改就會把整個default的物件屬性給覆蓋掉了,有時候會出現意想不到的麻煩。

不過,對於介面設計有要求的人來說,會希望有更高的自由度來對各個物件的顏色屬性去做定義,QPalette在某種程度上非常像Web前端程式設計中的Theme。(個人感覺,有誤請糾正)

About Palette

每一個物件(Widget)都有Palette參數,來定義其各種狀態下的顏色,包含幾個狀態(QColorGroup) — Disable, Active, Inactive, Normal其定義如下:

https://doc.qt.io/qt-5/qpalette.html

除此之外,物件的顏色會因不同的角色或類型(ColoRole)被設定,而官方建議,比起hard code所有的顏色到stylesheet,他們更建議以來自Palette 的ColorRole、ColorGroup來做物件顏色的設定。

主要的Color Role種類如下 :

https://doc.qt.io/qt-5/qpalette.html#ColorRole-enum

最後,官方高度建議(我也非常建議),在修改Palette的時候會好的方法會是使用 QGuiAppliction.palette()方法先取得default的palette再來做修改,以面有的參數沒有設定到而造成畫面出現問題。

顏色的設定可以使用 setColor()以及 setBrush()兩個funciton來完成,兩者差異如下:

https://www.itread01.com/content/1548619041.html

Implement

接下來就讓我們來實作一下吧!

def set_buttons(self):
self._window.palette_btn.setText('Set Palette')
self._window.exit_btn.clicked.connect(self.exit)
@QtCore.Slot()
def set_palette(self):
palette = self._window.palette()

color = QColor(self._window.input_line.text())
if color.isValid():
palette.setColor(QPalette.Normal,
QPalette.Background, color)
self._window.setPalette(palette)
self._window.update()
Palette Demo

Source Code

完整代碼請看 : Color_Palette

結論

在現在App畫面越來越精緻的情況下,沒有顏色的工廠式UI介面已被世人唾棄,而色彩的搭配在UI設計上面是非常重要的一環,有了QPalette,我們就可以使我們的畫面有更多的色彩。 不過要記得,有時錯誤的色彩搭配有時也可能比黑白畫面更加醜陋哩!

我是夜海中的宅男DekBan,我們下次見,see ya next night.

Next Step : PySide #12: 我還要更有型!StyleSheet, QFont, QFontDialog

--

--

DekBan
Bucketing

เด็กบ้าน | 🌃夜裡溜搭的宅男,漂泊於月色鋪成的海