PyQt5教程 22 自定義控制項

2021-07-16 06:53:23 字數 4709 閱讀 7108

pyqt5擁有豐富的控制項。然而,沒有哪個工具可以提供程式設計師在他們的應用程式中可能需要的所有部件。工具包通常只提供諸如按鈕、文字元件、或滑塊等最常見的控制項。如果有需要一種更專業的控制項,我們必須自己去建立它。

自定義控制項是通過使用該工具包提供的繪圖工具建立的。有兩種基本的可行性:程式設計師可以修改或增強現有控制項,或者他可以從頭開始建立乙個全新的自定義控制項。

這是乙個模擬燒錄軟體中的控制項例項,我們可以在nero,k3b或其他cd/ ***燒錄軟體中參考看看。

#!/usr/bin/python3

# -*- coding: utf-8 -*-

"""pyqt5 教程

在這個例子中,我們建立乙個自定義控制項。

部落格:"""import sys

qhboxlayout, qvboxlayout)

from pyqt5.qtcore import qt, qobject, pyqtsignal

from pyqt5.qtgui import qpainter, qfont, qcolor, qpen

class

communicate

(qobject):

updatebw = pyqtsignal(int)

class

burningwidget

(qwidget):

def__init__

(self):

super().__init__()

self.initui()

definitui

(self):

self.setminimumsize(1, 30)

self.value = 75

self.num = [75, 150, 225, 300, 375, 450, 525, 600, 675]

defsetvalue

(self, value):

self.value = value

defpaintevent

(self, e):

qp = qpainter()

qp.begin(self)

self.drawwidget(qp)

qp.end()

defdrawwidget

(self, qp):

font = qfont('serif', 7, qfont.light)

qp.setfont(font)

size = self.size()

w = size.width()

h = size.height()

step = int(round(w / 10.0))

till = int(((w / 750.0) * self.value))

full = int(((w / 750.0) * 700))

if self.value >= 700:

qp.setpen(qcolor(255, 255, 255))

qp.setbrush(qcolor(255, 255, 184))

qp.drawrect(0, 0, full, h)

qp.setpen(qcolor(255, 175, 175))

qp.setbrush(qcolor(255, 175, 175))

qp.drawrect(full, 0, till-full, h)

else:

qp.setpen(qcolor(255, 255, 255))

qp.setbrush(qcolor(255, 255, 184))

qp.drawrect(0, 0, till, h)

pen = qpen(qcolor(20, 20, 20), 1, qt.solidline)

qp.setpen(pen)

qp.setbrush(qt.nobrush)

qp.drawrect(0, 0, w-1, h-1)

j = 0

for i in range(step, 10*step, step):

qp.drawline(i, 0, i, 5)

metrics = qp.fontmetrics()

fw = metrics.width(str(self.num[j]))

qp.drawtext(i-fw/2, h/2, str(self.num[j]))

j = j+1

class

example

(qwidget):

def__init__

(self):

super().__init__()

self.initui()

definitui

(self):

sld = qslider(qt.horizontal, self)

sld.setfocuspolicy(qt.nofocus)

sld.setrange(1, 750)

sld.setvalue(75)

sld.setgeometry(30, 40, 150, 30)

self.c = communicate()

self.wid = burningwidget()

self.c.updatebw[int].connect(self.wid.setvalue)

sld.valuechanged[int].connect(self.changevalue)

hbox = qhboxlayout()

hbox.addwidget(self.wid)

vbox = qvboxlayout()

vbox.addstretch(1)

vbox.addlayout(hbox)

self.setlayout(vbox)

self.setgeometry(300, 300, 390, 210)

self.setwindowtitle('自定義控制項')

self.show()

defchangevalue

(self, value):

self.c.updatebw.emit(value)

self.wid.repaint()

if __name__ == '__main__':

ex = example()

在這個例子中,我們建立了乙個qslider 和乙個自定義控制項,滑塊控制自定義控制項的變化。這個控制項以圖形方式顯示給我們儲存介質的總容量與完成容量。自定義控制項的最小值為1,最大值為750。如果值達到700,我們開始用紅色繪製。這通常表示光碟燒毀。

燒錄控制項被放置在視窗的底部,這是使用乙個qhboxlayout 和乙個qvboxlayout實現。

class

burningwidget

(qwidget):

def__init__

(self):

super().__init__()

燒錄控制項是基於qwidget 的控制項。

self.setminimumsize(1, 30)
我們改變了控制項的最小尺寸(高度)。預設值對我們來說有點小。

font = qfont('serif', 7, qfont.light)

qp.setfont(font)

我們用較小的字型作為預設值,這更適合我們的需求。

size = self.size()

w = size.width()

h = size.height()

step = int(round(w / 10.0))

till = int(((w / 750.0) * self.value))

full = int(((w / 750.0) * 700))

我們繪製的控制項將會隨視窗的變化而改變自身的大小,更大的視窗會得到更大的燒錄控制項,反之亦然。所以我們需獲取視窗的大小,然後根據視窗的大小放置自定義控制項。till 引數定義:繪製已燒錄的大小,該值來自滑塊控制項,它是整個區域的比例。full 引數定義:在這個時候我們開始繪製紅色。注意使用浮點算術實現繪製將會更加精確。

實際的繪製分三個步驟繪製黃色或紅色和黃色矩形。然後,我們畫垂直線,將控制項分成幾部分。最後,我們得出它指示介質的容量的數量。

metrics = qp.fontmetrics()

fw = metrics.width(str(self.num[j]))

qp.drawtext(i-fw/2, h/2, str(self.num[j]))

我們使用字型規格繪製文字。我們必須知道圍繞垂直線的文字的寬度。

def

changevalue

(self, value):

self.c.updatebw.emit(value)

self.wid.repaint()

當我們移動滑塊,changevalue()方法被呼叫。裡面的方法,我們傳送自定義updatebw訊號與引數,引數是滑塊的當前值,該值用於計算燒錄控制項要繪製的容量。然後自定義控制項重新繪製。

程式執行後

PyQt5 自定義訊號槽函式

1 簡介 自定義訊號槽函式,當訊號傳送的時候,可以呼叫被繫結的槽函式 2 功能實現 coding utf 8 簡介 內建訊號槽示例 from pyqt5.qtcore import qobject,pyqtsignal 訊號物件 class qtypesignal qobject 定義乙個訊號 se...

pyqt5 自定義訊號與槽

coding utf 8 from pyqt5.qt import a 0class window qwidget 宣告無引數的訊號 signal1 pyqtsignal 宣告帶乙個int型別引數的訊號 signal2 pyqtsignal int 宣告帶int和str型別引數的訊號 signal3...

PyQt5 自定義對話方塊呼叫

目錄 1.概況 2.模態對話方塊 2.1 模態對話方塊滿足的條件 2.2 模態對話方塊的呼叫 3.非模態對話方塊 3.1 對話方塊設定條件 3.2 對話方塊呼叫 desc 自定義命令執行 from pyqt5.qtwidgets import qdialog from customcommand i...