PyQt模塊GUI(一)(大綱版)


首先配置環境,多看看官網文檔!!!PyQt比Python自帶的那個GUI組件強大很多。

主要是對庫的基本使用方法控件(按鈕,輸入控件,展示控件)做闡述。


目錄

常見模塊

PyQt程序基本結構

繼承關係

樣式控制QSS

控件的父子關係操作

信號與槽

QObject

QWidget

按鈕控件基類-QAbstractButton

QPushButton

QCommandLinkButton

QToolButton

QRadioButton

QButtonGroup

QCheckBox(複選框)

其他控件

輸入控件

展示控件


 

常見模塊

1、QtCore模塊涵蓋了包的核心的非GUI功能,此模塊被用於處理程序中涉及到的 time、文件、目錄、數據類型、文本流、鏈接、mime、線程或進程等對象。

2、QtGui模塊涵蓋多種基本圖形功能的類; 包括但不限於:窗口集、事件處理、2D圖形、基本的圖像和界面 和字體文本。

3、QtWidgets模塊包含了一整套UI元素組件,用於建立符合系統風格的classic界面,非常方便,可以在安裝時選擇是否使用此功能。

4、QtMultimedia模塊包含了一套類庫,該類庫被用於處理多媒體事件,通過調用API接口訪問攝像頭、語音設備、收發消息(radio functionality)等。

5、QtBluetooth模塊包含了處理藍牙活動的類庫,它的功能包括:掃描設備、連接、交互等行爲。

6、QtNetwork模塊包含用於網絡編程的類庫,這組類程序通過提供便捷的TCP/IP 及 UDP 的 c/s 程式碼集合,使得基於Qt的網絡編程更容易。

7、QtPositioning模塊用於獲取位置信息,此模塊允許使用多種方式達成定位,包括但不限於:衛星、無線網、文字信息。此應用一般用於網絡地圖定位系統。

8、Enginio模塊用於構建客戶端的應用程式庫,用於在運行時訪問 Qt Cloud 服務器託管的應用程序。

9、QtWebSockets模塊包含了一組類程序,用以實現websocket協議。

10、QtWebKit包含了用於實現基於webkit2的網絡瀏覽器的類庫。

11、QtWebKitWidgets模塊包含用於基於WebKit1的Web瀏覽器實現的類,用於基於QtWidgets的應用程序

12、QtXml模塊包含了用於處理XML的類庫,此模塊爲SAX和DOM API 的實現提供了方法。

13、QtSvg模塊通過一組類,爲顯示矢量圖形文件的內容提供了方法。

14、QtSql模塊提供了數據庫對象的接口以供使用

15、QtTest模塊包含了可以通過單元測試,以調試PyQt5應用程式的功能。

 

PyQt程序基本結構

  1. 導入所需包與模塊
  2. 創建一個應用程序對象
  3. 控件的操作(創建、設置、展示)
  4. 應用程序執行,進入消息循環隊列
#導入所需
from PyQt5.QtWidgets import QLabel, QFrame, QApplication, QWidget
import sys

# 創建一個應用程序
app = QApplication(sys.argv)

#控件的操作
window = QWidget()    #創建一個空白控件,當做頂層父控件使用
lable = QLabel(window)#
lable.setText("hello xiaobin")  #設置
window.setWindowTitle("第一個PyQt應用程序")
window.show()        #展示

#應用程序展示
sys.exit(app.exec_())

####也可以將其設置爲活動模板

或者

import sys
from PyQt5.QtWidgets import QWidget, QApplication, QLabel

"""面向對象版本"""
class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(500,500)
        self.setWindowTitle("XB")
        lable = QLabel(self)
        lable.setText("hello xiaoxbin")


app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())

效果如圖

 

繼承關係

  1. 導入查看控件
  2. 打印

以獲取QWidget的子類爲例:

from PyQt5.QtWidgets import QWidget
print(QWidget.__subclasses__())

以下是GUI中所有的基類:

 

樣式控制QSS

和CSS類似的功能,但是不完全通用,詳見幫助文檔

初步使用:

這裏要涉及Object對象的設置對象名稱和屬性的API,在上面例子的基礎上:

 lable = QLabel(self)
 lable.setText("hello xiaoxbin")
 lable.setStyleSheet("font-size:20px;color:red;")

效果如圖:

注: lable.setStyleSheet("font-size:20px;color:red;")設置了樣式

但是在實際開發中一般單獨寫成xxx.qss文件分離開來,先編寫xxx.qss文件:

QLabel
{
    font-size:20px;color:red;
}

在python文件中: 

 with open("testqss.qss","r") as f:
      qApp.setStyleSheet(f.read())
 lable = QLabel(self)
 lable.setText("hello xiaoxbin")

注:與上面的例子中的lable.setStyleSheet("font-size:20px;color:red;")是一樣的。

但是這樣會把所有的Label控件的格式都設置成這樣,爲了進行區分就要使用id選擇器,格式爲:標籤名+#+id:

QLabel#xx1
{
    font-size:20px;color:red;
}

然後用setObjectName()設置對應的id即可

        with open("testqss.qss","r") as f:
            qApp.setStyleSheet(f.read())
        lable1 = QLabel(self)
        lable1.setText("hello xiaoxbin")

        lable2 = QLabel(self)
        lable2.setText("hello ranxia")
        lable2.setObjectName("xx1")
        lable2.move(100,100)

效果如下,沒有設置id的label1則沒有應用該樣式。 

同一樣式下還要進行區分的話就要用到屬性了,qss文件如下:

QLabel#xx1
{
    font-size:20px;
}
QLabel#xx1[xx1_level="blue"]
{
    font-size:20px;color:blue;
}
QLabel#xx1[xx1_level="red"]
{
    font-size:20px;color:red;
}

在python文件中用setProperty()進行設置:

 with open("testqss.qss","r") as f:
     qApp.setStyleSheet(f.read())
 lable1 = QLabel(self)
 lable1.setText("hello xiaoxbin")
 lable1.setObjectName("xx1")
 lable1.setProperty("xx1_level","blue")

 lable2 = QLabel(self)
 lable2.setText("hello ranxia")
 lable2.move(100,100)
 lable2.setObjectName("xx1")
 lable2.setProperty("xx1_level", "red")

 效果如下:

 

控件的父子關係操作

這裏的父子關係不是繼承關係,而是自己綁定的,以達到某些功能。

1、API

  • setParent()
  • parent()
  • child()
  • findChild()
  • findChildren()

2、應用

一個控件如果沒有父控件,其就會被當成頂層控件,各自獨立,如果需要包含在某個控件之內,就需要設置父子關係,以此達到顯示和生命週期約束的功能。

  • 內存管理,父控件被釋放子控件也會被釋放(比如大控件被關閉,其上的子控件內存也會被釋放)。
  • 顯示層級,子控件會顯示在父控件上,不會超出其範圍。

比如:

app = QApplication(sys.argv)
window1 = QWidget()
window1.show()
window2 = QWidget()
window2.show()
sys.exit(app.exec_())

因爲沒有父子關係,所以此時會出現兩個窗體:

當通過setParent()設置父子關係後,加以顏色區分,如下: 

 

 

信號與槽

同於對象之間的通訊。

信號與槽需要連接。也都有內置和自定義兩種。一個信號可與多個槽函數連接,反之亦然,也可以和另一個信號連接。

信號:控件狀態發生改變時發出,比如按鈕被點擊了會發出click信號。

槽:即槽函數,接收信號後會觸發的事件,即處理信號的函數。

相關API:

  1. connect(XX):連接信號與槽函數,比如YY對象銷燬時觸發XX()槽函數:YY.destroy.connect(XX)。
  2. disconnect():取消連接信號與槽函數,比如:YY.destroy.disconnect()。
  3. blockSignals(boolean):臨時阻斷控件所有信號與槽的連接。
  4. singnalsBlocked():判斷信號是否被阻斷。
  5. receivers():返回連接信號的槽個數。

比如按鈕的點擊事件:

lable1 = QLabel(self)
lable1.setText("我還沒被點擊!")

button = QPushButton(self)
button.move(0,100)
button.setText("點擊我")
#定義槽函數
def cao():
    lable1.setText("我被點擊了!")
button.clicked.connect(cao)#將按鈕的點擊與槽函數連接

效果如下:

         

 

QObject

也就是些API的使用,以後遇到再系統學習吧。因爲它是所有控件的父類,所以至關重要,也是學所有控件用法的第一步!

 

QWidget

  • 直接繼承至QObject
  • 所有可視控件的基類
  • 是一個空白控件
  • 通常用來作爲窗口和父控件

注:子控件要在父控件展示之前設置好。

=======> API

1、獲取位置

2、設置位置

3、限制尺寸

’4、內容邊距

 5、鼠標操作(形狀、大小.....)

設置鼠標setCursor(),QCursor對象可用於但不侷限於自定義鼠標圖案。

6、鼠標重置:unSetCursor(),用來還遠鼠標。

7、鼠標跟蹤

8、Cursor對象:鼠標的基本對象,獲取其屬性之類的。

 

=======>事件消息

消息是層層分發的,另外如果子控件沒有實現事件處理則會分發給其父控件處理,主要種類如下:

  1. 控件顯示和關閉事件。
  2. 控件移動事件
  3. 調整大小事件
  4. 鼠標事件
  5. 鍵盤事件
  6. 焦點事件
  7. 拖拽事件:比如上傳圖片時拖進控件
  8. 繪製事件
  9. 改變事件:比如中英文切換
  10. 右鍵菜單事件
  11. 輸入法事件

 

=======>事件機制

 

=====>父子關係擴充

在QObject的父子關係上擴充的API

 

=====>控件層級控制

在同一父對象的子控件中出現在控件相互遮擋,默認情況下後添加的控件會在前面,會遮擋先前出現的控件,所以需要層級控制。

 

=====>頂層窗口操作

注:窗口狀態,標誌,最大化最小化一般用在自定義窗口標題欄。

以改變程序圖標爲例:

icon = QIcon("icon_fish.png")
window.setWindowIcon(icon)

 

=======> 交互狀態

注:活躍窗口就是在多個窗口下只有一個與用戶交互

 

=======> 信息提示

比如鼠標懸停在某個控件上時狀態欄會給出提示信息,一般只有組合控件纔有狀態欄。例:

app = QApplication(sys.argv)
window = QMainWindow()
window.resize(200,100)
window.statusBar()
window.setStatusTip("這是狀態欄")
window.show()
sys.exit(app.exec_())

效果如圖: 

 

=======> 焦點控制

比如文本框的那個光標...只有獲取了焦點的控件才能與用戶交互。

單個控件角度

 父控件角度

 

=======>信號

 


按鈕控件基類-QAbstractButton

是一個抽象類,無法直接使用,只能使用其子類(可自定義),所有按鈕控件的基類!!!

可用信號:

 

注:自動重複就是比如按下按鈕不鬆開一直重複執行某槽函數 ;點擊就是模擬點擊事件調用對應的槽函數(如:click())。

其主要的子類有:

  1. QPushButton:普通的那種按鈕
  2.                      --->QCommandLinkButton:繼承至QPushButton
  3. QRadioButton:單選按鈕
  4. QCheckButon:複選框
  5. QToolButton:下拉菜單

 

QPushButton

普通的按鈕,比如登錄、註冊那個按鈕,下拉菜單等。繼承至QAbstractButton()。

========>構造函數

========>作爲菜單

一個小案例: 

import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QMenu, QAction

app = QApplication(sys.argv)

window = QMainWindow()
window.resize(500,300)
#設置按鈕
btn = QPushButton(QIcon("icon_fish.png"),"這是個按鈕",window)
btn.resize(150,30)
#設置菜單
menu = QMenu()
redaction = QAction(QIcon("icon_fish.png"),"紅色",menu)#行爲就是子菜單點擊後直接執行的那一項,無其子菜單
redaction.triggered.connect(lambda :window.setStyleSheet("background-color:red"))#點擊後改變背景色
menu.addAction(redaction)

blueaction = QAction(QIcon("icon_fish.png"),"藍色",menu)#行爲就是子菜單點擊後直接執行的那一項,無其子菜單
blueaction.triggered.connect(lambda :window.setStyleSheet("background-color:blue"))#點擊後改變背景色
menu.addAction(blueaction)

menu.addSeparator()#添加分割線
#設置子菜單,就是一個QMenu加上另一個QMenu
othermenu = QMenu(menu)
othermenu.setTitle("其他")
otheraction = QAction("綠色",othermenu)
otheraction.triggered.connect(lambda :window.setStyleSheet("background-color:green"))
othermenu.addAction(otheraction)
menu.addMenu(othermenu)#添加子菜單

btn.setMenu(menu)
window.show()

sys.exit(app.exec_())

效果如下: 

 

=======>邊框是否扁平

就是取消按鈕的凸起感,此時背景顏色也不再繪製。

 

=======>默認處理

一般應用在多個按鈕情況下聚焦在某一個默認的按鈕,按下enter時默認觸發的按鈕。

 

=======>右鍵菜單

就是點擊右鍵會彈出一個菜單。其信號都是繼承至QWidget和QAbstractButton,只有兩個較爲特殊:

 

QCommandLinkButton

  • 繼承至QPushButton
  • 類似於單選按鈕,用在一組互斥選項之間選擇。
  • 不應單獨使用,而應作爲嚮導和對話框中的單選按鈕。
  • 外觀像扁平化的按鈕,除了普通文本以外,還允許描述性文本。

 

=======>構造函數

QCommandLinkButton(parent: QWidget = None)
QCommandLinkButton(str, parent: QWidget = None)
QCommandLinkButton(str, str, parent: QWidget = None)

=======>信號

完全是它父類的信號,無新加。

一個小栗子:

but = QCommandLinkButton("標題","這是一個QCommandLinkButton的描述",window)

效果:

 

QToolButton

一般用在應用的圖標導航欄那。官方文檔裏就一個構造函數QToolButton(parent: QWidget = None)。

but.setIcon(QIcon("icon_fish.png"))
but.setIconSize(QSize(60,60))
but.setToolTip("這是一條魚")

效果:

========>樣式風格 

 

======>設置箭頭

就是把圖片那一步用自己的API設置成箭頭而已。

 

=======>自動提升

就是設置其扁平化

 

=======>菜單

主要兩個API:

  1. setMenu(QMenu)
  2. menu()

一般情況下不彈出菜單的,需要設置彈出模式:

 

=======>信號

只重寫了一個,其他都是繼承的。

其中的setData()這個函數綁定的數據是任意的,用於在獲取action後區分不同的action以做出不同的響應。

 

QRadioButton

單選按鈕,比如選擇性別等等。一個選中另一個會被取消。繼承至QAbstractButton。

 

=======>信號

均繼承至父類,常用toggled(bool)。

=======>多組互斥

  • 爲了解決這個問題一般講每組放在不同控件
  • 也可以放在不同組裏面(QButtonGroup),常用!!!!!。

QButtonGroup

  • 提供 一個抽象的按鈕容器, 可以將多個按鈕劃分爲一組
  • 不具備可視化的效果
  • 繼承至QObject
  • 就一個構造方法:QButtonGroup(parent)

========>添加按鈕

 

=======>查看按鈕

獲取指定條件的按鈕

 

=======>移除按鈕

從邏輯關係上移除指定的按鈕(不是從界面上移除)。

removeButton(QAbstractButton)

 

=======>綁定和獲取ID

設置ID, 方便識別用戶選項

 

=======>獨佔設置

統一設置按鈕組中的按鈕是否是獨佔(選擇互斥)

 

=======>信號

 

QCheckBox(複選框)

看文檔吧,和單選框大同小異。

 

其他控件

前面通過對button類控件的學習和兩個主要的基類QObject和QWidget的學習,基本上已經瞭解了PyQt的控件使用風格,其他控件也大同小異,這裏不一一贅述了,實際開發中用到再深入。

 

輸入控件

========>純鍵盤文本輸入

  1. QLineEdit:是一個單行文本編輯器,比如用來輸入賬號信息等。
  2. QTextEdit:是一個高級的WYSIWYG查看器/編輯器,支持使用HTML樣式標籤的富文本格式,可以加載純文本和富文本文件。
  3. QPlainTextEdit:與QTextEdit大致功能實現差不多,但更適用於純文本。
  4. QKeySequenceEdit:允許輸入QKeySequence, 它通常用作快捷方式。採集用戶在鍵盤按下的快捷鍵,外形和單行文本相似

 

========>步長調節(QAbstractSpinBox) (鍵盤+鼠標)

  1. QSpinBox:主要處理整數和離散值集,允許用戶通過單擊向上/向下按鈕或按鍵盤上的上/下來選擇一個值來增加/減少當前顯示的值。用戶還可以手動鍵入值,比如月份的調節等等。
  2. QDoubleSpinBox:浮點類型步長調節器,既可以通過步長調節器調整數據, 也可以通過文本框直接編輯,比如1.00 % - 99.99 %等等。
  3. QDateTimeEdit:編輯日期和時間的單行文本框,既可以用箭頭調節, 也可以用鍵盤編輯輸入,可以單獨調節某個部分。有兩個子類QDateEdit和QTimeEdit

 

========>組合框(下拉選擇輸入)

  1. QComboBox:是一個組合控件,可通過下拉選擇界面, 選取更多的預置選項,有一個子類QFontComboBox。

 

========>滑塊(QAbstractSlider)(鼠標)

比如音量調節,視頻進度條,收音機按鈕等等。

  1. QSlider:垂直或水平滑塊,它允許用戶沿水平或垂直凹槽移動滑塊手柄,並將手柄的位置轉換爲合法範圍內的整數值。
  2. QScrollBar:使用戶能夠訪問比用於顯示它的窗口小部件更大的文檔部分,一般是結合QAbstractScrollArea使用,滾動條通常包括四個單獨的控件:滑塊,滾動箭頭和頁面控件。
  3. QDial:倒圓的範圍控制,比如汽車儀表盤上的速度計

 

========>橡皮筋選中

  1. QRubberBand:提供一個矩形或線來指示選擇或邊界,一般結合鼠標事件一同協作。你如選擇操作時用鼠標劃一個矩形選擇框。

 

========>對話框(QDialog)

  1. QFontDialog:提供了一種選擇字體的對話框控件。比如WPS的字體選擇。
  2. QColorDialog:顏色對話框的功能是允許用戶選擇顏色。
  3. QFileDialog:提供了一個對話框,允許用戶選擇文件或目錄,允許用戶遍歷文件系統,以選擇一個或多個文件或目錄。
  4. QInputDialog:提供了一個簡單方便的對話框,獲得來自用戶的單個值,輸入值可以是字符串,數字或列表中的項目,設置標籤以告知用戶應輸入的內容。

 

========>日期

  1. QCalendarWidget:提供了一個基於每月日曆控件,允許用戶選擇一個日期。

 

展示控件

  1. QLabel:提供了文本或圖像的顯示,無交互功能。
  2. QLCDNumber:展示LCD樣式的數字,它可以顯示幾乎任何大小的數字,它可以顯示十進制,十六進制,八進制或二進制數。
  3. QProgressBar:提供一個水平或垂直進度條。
  4. 對話框(QDialog):即消息提示框,不需要添加到其他父控件。QMessageBox,QErrorMessage,QProgressDialog。

 

總之所有語言的GUI都差不多,多看文檔熟悉API就行!!!!!!!


參考:

  1. 知乎大佬
  2. 環境配置
  3. QSS幫助文檔QSS知乎講解
  4. PyQtBiLiBiLi
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章