PyQt5系列教程(21):標籤(QLabel)

上期我們介紹了PyQt中的液晶顯示屏(QLCDNumber),這期我們介紹一下PyQt中常用的一個小部件標籤(QLabel)。

總體介紹

QLabel小部件提供文本或圖像顯示。

QLabel用於顯示文本或圖像。沒有提供用戶交互功能。標籤的外觀可以通過各種方式進行配置,可以用於指定另一個小部件的焦點助記鍵。

QLabel可以包含以下任何內容類型:

當使用任何方法改變內容時,任何先前的內容都被清除。

警告:當在QLabel中使用setText()設置文本內容的時候,因為QLabel會嘗試猜測它是將文本顯示為純文本還是作為HTML 4標記的一部分的富文本。想明確地顯示文本格式,請調用setTextFormat(),例如如果您希望文本是純文本格式,但無法控制文本源(例如,顯示從Web上載入的數據時)。

默認情況下,標籤顯示左對齊、垂直居中的文本和圖像。QLabel的外觀可以通過多種方式進行調整和微調。

可以使用setAlignment()和setIndent()來調整QLabel小部件區域內的內容定位。文本內容還可以使用setwordpwrap ()沿單詞邊界換行。

例如,這段代碼在右下角設置了一個雙行文本的凹陷面板(兩行與標籤的右側齊平):

label = QLabel(self)nlabel.resize(200,100)nlabel.setFrameStyle(QFrame.Panel | QFrame.Sunken)nlabel.setText("first linensecond line")nlabel.setAlignment(Qt.AlignBottom | Qt.AlignRight)n

QLabel從QFrame繼承的屬性和函數,也可以用來指定要用於任何給定標籤的構件框架。

更多的介紹請見官網:QLabel Class | Qt Widgets 5.10

QLabel的小例子

今天的例子比較多,需要一一演示。

純文本演示

部分核心代碼如下:

class Example(QWidget):nn def initUI(self):nn self.lb1 = QLabel(學點編程吧,我愛你~!,self)n self.lb2 = QLabel(我內容很少哦...,self)n self.lb3 = QLabel(我內容很少哦...,self)n self.lb3.setWordWrap(True)nn self.bt1 = QPushButton(輸入內容1,self)n self.bt2 = QPushButton(輸入內容2,self)nnn self.ra1 = QRadioButton(左邊,self)n self.ra2 = QRadioButton(中間,self)n self.ra3 = QRadioButton(右邊,self)nn self.bg1 = QButtonGroup(self)n self.bg1.addButton(self.ra1, 1)n self.bg1.addButton(self.ra2, 2)n self.bg1.addButton(self.ra3, 3)nn self.show()nn self.bg1.buttonClicked.connect(self.rbclicked)n self.bt1.clicked.connect(self.showDialog)n self.bt2.clicked.connect(self.showDialog)nn def rbclicked(self):n if self.bg1.checkedId() == 1:n self.lb1.setAlignment(Qt.AlignVCenter | Qt.AlignLeft)n elif self.bg1.checkedId() == 2:n self.lb1.setAlignment(Qt.AlignCenter)n elif self.bg1.checkedId() == 3:n self.lb1.setAlignment(Qt.AlignVCenter | Qt.AlignRight)n n def showDialog(self):n sender = self.sender()n if sender == self.bt1:n text, ok = QInputDialog.getText(self, 內容1, 請輸入內容1:)n if ok:n self.lb2.setText(text)n elif sender == self.bt2:n text, ok = QInputDialog.getText(self, 內容2, 請輸入內容2:)n if ok:n self.lb3.setText(str(text))n

這個例子主要是實現了兩個功能:

  • QLabel內容的對齊方式:這裡我們給出了三個:左中、中間、右中。
  • 當QLabel內容較多的時候,裡面的內容可以換行,這裡通過兩個輸入對話框我們對比實現了。

self.lb3 = QLabel(我內容很少哦...,self)nself.lb3.setWordWrap(True)n

將WordWrap的屬性設置為True,實現自動換行,默認是不能自動換行的。

def rbclicked(self):n if self.bg1.checkedId() == 1:n self.lb1.setAlignment(Qt.AlignVCenter | Qt.AlignLeft) elif self.bg1.checkedId() == 2:n self.lb1.setAlignment(Qt.AlignCenter) elif self.bg1.checkedId() == 3:n self.lb1.setAlignment(Qt.AlignVCenter | Qt.AlignRight)n

當我們點擊不同的單選按鈕的時候會對QLabel的內容進行相應的對齊。默認情況下,標籤的內容是左對齊和垂直居中的。其它的情況如下:

它包含水平和垂直的標誌,可以結合起來產生所需的效果。

水平標誌是:

垂直標誌是:

一次最多可以使用一個水平和一個垂直標誌。當然凡是也有例外,下面的就可以可表現出兩個屬性。

Qt.AlignCenter: 水平、垂直居中

富文本演示

部分核心代碼如下:

class Example(QWidget):n def initUI(self):nn lb = QLabel(self)nn html = n <style type="text/css">n table.imagetable {n font-family: verdana,arial,sans-serif;n font-size:11px;n color:#333333;n border-width: 1px;n border-color: #999999;n border-collapse: collapse;n }n #...裡面眾多的CSS內容,我就省略了,節約空間n n lb.setText(html)n self.show()n

這個表格是不是很好看啊!

PyQt5的文本小部件能夠顯示豐富的文本,使用HTML4標記的一個子集指定,具體內容顯示哪些內容,請見官方文檔:doc.qt.io/qt-5/richtext,,常用的HTML標記和CSS屬性是支持的。

圖片演示

部分核心代碼如下:

class Example(QWidget):n def initUI(self):nn pix = QPixmap(sexy.jpg)nn lb1 = QLabel(self)n lb1.setGeometry(0,0,300,200)n lb1.setStyleSheet("border: 2px solid red")n lb1.setPixmap(pix)nn lb2 = QLabel(self)n lb2.setGeometry(0,250,300,200)n lb2.setPixmap(pix)n lb2.setStyleSheet("border: 2px solid red")n lb2.setScaledContents(True)n

圖片的演示是一個對比演示。

我們先用QPixmap()創建一個QPixmap對象,然後在兩個QLabel對象中分別插入,不同的地方在於:

  • lb1我們是直接插入
  • lb2,我們啟用了setScaledContents(True),這個函數的意義就在於是否將縮放其內容以填充所有可用空間。當啟用時,標籤顯示一個像素圖,它將縮放像素圖以填充可用空間。該屬性的默認值是False。

setStyleSheet()是為了便於大家查看我們設置這個標籤的大小範圍而已。詳細的解釋請看上一章節《液晶顯示屏》。

動畫演示

部分核心代碼如下:

class Example(QWidget):nn def initUI(self):nn self.lb = QLabel(self)n self.lb.setGeometry(100,50,300,200)nn self.bt1 = QPushButton(開始,self)n self.bt2 = QPushButton(停止,self)nn self.pix = QPixmap(movie.gif)n self.lb.setPixmap(self.pix)n self.lb.setScaledContents(True)nn self.bt1.clicked.connect(Branded Short Domain Powered by Bitly)n self.bt2.clicked.connect(Branded Short Domain Powered by Bitly)nn self.show()n def run(self):n movie = QMovie("movie.gif")n self.lb.setMovie(movie)n if self.sender() == self.bt1:n movie.start()n else:n movie.stop()n self.lb.setPixmap(self.pix)n

沒想到吧,QLabel還有這兇殘技能,放動畫。。。

這段代碼的關鍵就是QMovie的使用,簡單介紹一下吧。

QMovie類是用QImageReader播放動畫的便捷類。

這個類用來顯示沒有聲音的簡單的動畫。如果您要顯示視頻和媒體內容,請改為使用Qt多媒體多媒體框架。

首先,來創建一個QMovie對象。在啟動電影之前,您可以調用isValid()來檢查圖像數據是否有效。要啟動電影,請調用start()。 QMovie將進入運行狀態,並發出start()和stateChanged()。要獲得電影的當前狀態,請調用state()。

要在應用程序中顯示電影,可以將QMovie對象傳遞給QLabel.setMovie()。例:

label = QLabel(self)nmovie = QMovie("animations/fire.gif")nlabel.setMovie(movie)nmovie.start()n

每當電影中有新的幀時,QMovie將發出updated()信號。如果框架的大小發生變化,則發出resized()信號。您可以調用currentImage()或currentPixmap()來獲取當前幀的副本。當電影完成後,QMovie發出finished()。如果播放過程中發生錯誤(即圖像文件損壞),QMovie將發出error()。

您可以通過調用setSpeed()來控制電影播放的速度,setSpeed()將原始速度的百分比作為參數。通過調用setPaused(True)來暫停電影。 QMovie將進入暫停狀態並發出stateChanged()。如果您調用setPaused(False),QMovie將重新進入運行狀態並再次啟動電影。要停止電影,請使用stop()。

某些動畫格式允許您設置背景顏色。你可以調用setBackgroundColor()來設置顏色,或者調用backgroundColor()來獲取當前的背景顏色。

currentFrameNumber()返回當前幀的序列號。如果圖像格式支持,frameCount()將返回動畫中的總幀數。您可以調用loopCount()來獲取電影在完成前應循環的次數。 nextFrameDelay()返回當前幀應顯示的毫秒數。

可以通過調用setCacheMode()來指示QMovie緩存動畫幀。

調用supportedFormats()以獲取QMovie支持的格式列表。

def run(self):n movie = QMovie("movie.gif")n self.lb.setMovie(movie)n if self.sender() == self.bt1:n movie.start()n else:n movie.stop()n self.lb.setPixmap(self.pix)n

這個函數很簡單就是當我們點擊「開始」按鈕的時候,播放動畫;點擊「停止」按鈕的時候,停止動畫。

最後

ok,今天的介紹暫時就到這裡吧,只要時間充裕我會多發幾章的。如果你喜歡本篇文章,請給我

點贊

讚賞(推薦)

分享給你的好友們吧!

如果你想要本次教程中的相關源碼,請關注微信公眾號:學點編程吧,發送pyqt521,會自動得到相應的百度網盤下載鏈接。


推薦閱讀:

PyQt5系列教程(17):跑馬燈(進度條的使用)
PyQt5系列教程(7):界面搭建
Qt桌面開發的困惑?
PyQt4教程的對話框(QInputDialog)例子里的一段代碼,為什麼要這樣寫?
有哪些顏值高的 PyQt/Qt 應用?

TAG:PyQt | Python | Python教程 |