Python GUI編程之PyQt5入門到實戰

2022-01-01 技術讓夢想更偉大

收錄於話題 #qt 進階 33個

關注、星標公眾號,直達精彩內容

來源:CSDN

作者:Erics-1996

以下文章來源於CSDN,作者是Erics-1996,個人覺得寫得不錯分享給大家。這篇文章主要介紹了詳解Python GUI編程之PyQt5入門到實戰,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。

文章目錄

1. PyQt5基礎

2. QtDesigner的使用

3. PyQt5核心API的使用

4. PyQt5中常用控制項API的使用

1.1 GUI編程學什麼

1.2 PyQT是什麼

1.3 PyQT的優勢

1.4 開發環境的安裝

1.5 第一個pyqt5桌面應用

2.1 安裝和配置

2.2 快速入門

2.3 將ui文件轉換成py文件

2.4 水平布局

2.5 垂直布局

2.6 同時使用水平布局和垂直布局

2.7 柵格布局

2.8 表單布局

2.9 容器布局

2.10 絕對布局

2.11 布局中的間隔和分割線

2.12 控制項最大尺寸和最小尺寸

2.13 尺寸策略

2.14 設置控制項之間的夥伴關係

2.15 修改控制項的Tab順序

2.16 信號與槽的設置

2.17 添加菜單和工具欄

3.1 創建主窗口

3.2 主窗口居中顯示

3.3 退出應用程式

3.4 屏幕坐標系

3.5 設置窗口和應用程式圖標

3.6 控制項添加提示消息

4.1 QLabel控制項的基本用法

4.2 QLabel與夥伴控制項

4.3 QLineEdit控制項與回顯模式

4.4 QLineEdit控制項的校驗器

4.5 使用掩碼限制QLineEdit控制項的輸入

4.6 QLineEdit控制項綜合案例

1. PyQt5基礎1.1 GUI編程學什麼1.2 PyQT是什麼

QT是跨平臺C++庫的集合,它實現高級API來訪問現代桌面和移動系統的許多方面。這些服務包括定位和定位服務、多媒體、NFC和藍牙連接、基於Chromium的web瀏覽器以及傳統的UI開發。PyQt5是Qt v5的一組完整的Python綁定。它被實現為超過35個擴展模塊,並使Python在所有支持的平臺(包括IOS和Android)上被用作C++的替代應用程式開發語言。PyQT5也可以嵌入在基於C++的應用程式中,以允許這些應用程式的用戶配置或增強這些應用程式的功能。

1.3 PyQT的優勢

簡單好用

功能強大

跨平臺支持

性能高

文檔齊全:PyQT本身就是對QT庫Python的綁定,在綁定的時候保持了原有的QT庫的API。也就是說,PyQT除了自己的文檔外,也幾乎可以通用QT文檔。

穩定性高:面向對象、信號與槽的機制、界面設計與業務代碼完全隔離

生態支持:QU Designer進行圖形界面設計、ui轉換成py文件、資源處理

開源免費:PyQT是雙重許可的,開發人員可以在GPL和商業許可之間進行選擇。採用GPL協議,軟體著作權屬於開發者本人所有,受國際相關版權法保護,允許其他用戶對原作者軟體進行複製和發行,也可以更改後髮型自己的軟體。

1.4 開發環境的安裝

首先,基本的 Python3 環境和 PyCharm 開發工具的安裝,由於比較簡單,博主在這裡不再詳細演示了!實在有問題的可以自行Google或者百度。其次就是GUI開發環境的安裝,也就是安裝PyQT5。這裡演示在Python的虛擬環境中來安裝PyQT5(Ubuntu Linux系統):

# 在Python全局環境中安裝pipenv
$ pip3 install pipenv -i https://pypi.tuna.tsinghua.edu.cn/simple

# 創建項目目錄
$ mkdir pyqt5-pro

# 進入項目目錄
$ cd pyqt5-pro/

# 創建虛擬環境
$ pipenv --three

# 激活虛擬環境(激活環境後會自動創建Pipfile文件)
$ pipenv shell

# 為加速安裝,將源改為國內源
(pyqt5-pro) $ vim Pipfile
url = "https://pypi.tuna.tsinghua.edu.cn/simple"

# 安裝pyqt5庫
(pyqt5-pro) $ pipenv install pyqt5

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

這個時候我們使用Pycharm打開這個項目文件夾:

可以從設置中看到該項目依賴的Python環境:

1.5 第一個pyqt5桌面應用

示例代碼:

from PyQt5.Qt import *
import sys

if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個窗口
window = QWidget()
# 設置窗口標題
window.setWindowTitle('Hello World!')
# 設置窗口尺寸
window.resize(400, 400)
# 移動窗口位置
window.move(1000, 300)
# 創建label控制項
label = QLabel(window)
# 為控制項設置文本
label.setText('Hello World!')
# 移動空間的位置
label.move(160, 160)
# 顯示窗口
window.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

效果圖[在windows平臺中顯示有差別於Linux(注意我這不是Mac OS系統,只是ubuntu linux系統使用了Mac OS的主題)]:

2. QtDesigner的使用2.1 安裝和配置

安裝Qt的工具包:

pip install PyQt5-tools -i https://pypi.douban.com/simple

安裝完成後,QTdesigner 就在你的 python 環境下的擴展包裡面了!

將QtDesigner集成到Pycharm:

2.2 快速入門

可以通過配置好的PyCharm擴展工具直接打開QTDesigner:

簡單介紹QTDesigner幾個主要部分:

Ctrl+S後可以將其保存到項目根目錄:

2.3 將ui文件轉換成py文件

第一種方法:

$ python -m PyQt5.uic.pyuic demo.ui -o demo.py

第二種方法:

$ pyuic5 demo.ui -o demo.py

第三種方法:把第一種方法中命令集成到 PyCharm 中,首先需要使用 $ which python 查看當前使用的Python目錄,

(pyqt5-pro) $ which python
/home/thanlon/.local/share/virtualenvs/pyqt5-pro-ihgfaRRJ/bin/python

將其複製粘貼到【Program】部分。然後再把 -m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py 加入到【Arguments】部分。再把 $FileDir$ 加入到【Working directory】中:

轉換之後,在項目目錄下會生成.py文件:

2.4 水平布局

使用水平布局的方式在QtDesigner中做一些簡單的操作,如下圖所示:

將.ui文件轉換成.py文件後新建 RunMainWinHorizontalLayout.py 文件用來運行轉換之後的.py文件 MainWinHorizontalLayout.py:

import sys
import MainWinHorizontalLayout
from PyQt5.QtWidgets import QApplication, QMainWindow

if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個主窗口
mainWindow = QMainWindow()
# 創建Ui_MainWindow的實例
ui = MainWinHorizontalLayout.Ui_MainWindow()
# 調用setupUi在指定窗口(主窗口)中添加控制項
ui.setupUi(mainWindow)
# 顯示窗口
mainWindow.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

運行這個Python文件得到:

2.5 垂直布局

使用垂直布局的方式在QtDesigner中了做一些簡單的操作,如下圖所示:

將.ui文件轉換成.py文件後新建 RunMainWinVerticalLayout.py 文件用來運行轉換之後的.py文件 MainWinVerticalLayout.py:

import sys
import MainWinVerticalLayout
from PyQt5.QtWidgets import QApplication, QMainWindow

if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個主窗口
mainWindow = QMainWindow()
# 創建Ui_MainWindow的實例
ui = MainWinVerticalLayout.Ui_MainWindow()
# 調用setupUi在指定窗口(主窗口)中添加控制項
ui.setupUi(mainWindow)
# 顯示窗口
mainWindow.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

運行這個.py文件得到:

2.6 同時使用水平布局和垂直布局

「姓名」和「薪資」兩行都使用水平布局,「備註+文本框」和它們一起使用垂直布局:

將.ui文件轉換成.py文件後新建 RunMainWinHVLayout.py 文件用來運行轉換之後的.py文件:

import sys
import RunMainWinVHLayout
from PyQt5.QtWidgets import QApplication, QMainWindow

if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個主窗口
mainWindow = QMainWindow()
# 創建Ui_MainWindow的實例
ui = RunMainWinVHLayout.Ui_MainWindow()
# 調用setupUi在指定窗口(主窗口)中添加控制項
ui.setupUi(mainWindow)
# 顯示窗口
mainWindow.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

2.7 柵格布局

下面是使用柵格布局設計的:

將.ui文件轉換成.py文件後新建 RunMainWinGridLayout.py 文件用來運行轉換之後的.py文件:

import sys
import MainWinGridLayout
from PyQt5.QtWidgets import QApplication, QMainWindow

if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個主窗口
mainWindow = QMainWindow()
# 創建Ui_MainWindow的實例
ui = MainWinGridLayout.Ui_MainWindow()
# 調用setupUi在指定窗口(主窗口)中添加控制項
ui.setupUi(mainWindow)
# 顯示窗口
mainWindow.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

2.8 表單布局

下面是使用表單布局設計的:

將.ui文件轉換成.py文件後新建 RunMainWinFormLayout.py 文件用來運行轉換之後的.py文件:

import sys
import MainWinFormLayout
from PyQt5.QtWidgets import QApplication, QMainWindow

if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個主窗口
mainWindow = QMainWindow()
# 創建Ui_MainWindow的實例
ui = MainWinFormLayout.Ui_MainWindow()
# 調用setupUi在指定窗口(主窗口)中添加控制項
ui.setupUi(mainWindow)
# 顯示窗口
mainWindow.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

右鍵選擇布局的時候選擇「在窗體布局中布局」。

2.9 容器布局

布局和容器之間可以相互轉換,下面以 QFrame 和 Grid Layout 相互轉換為例子。第一個是把容器 QFrame 轉換成 Grid Layout,第二個是把 Grid Layout 轉換成容器 QFrame:

將 .ui 文件轉換成 .py 文件後新建 RunMainWinContainerLayout.py 文件用來運行轉換之後的 .py 文件:

import sys

from PyQt5.QtWidgets import QApplication, QMainWindow
import MainWinContainerLayout
if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個主窗口
mainWindow = QMainWindow()
# 創建Ui_MainWindow的實例
ui = MainWinContainerLayout.Ui_MainWindow()
# 調用setupUi在指定窗口(主窗口)中添加控制項
ui.setupUi(mainWindow)
# 顯示窗口
mainWindow.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

2.10 絕對布局

直接把空間放到容器或者窗口中默認是絕對布局,根據坐標屬性可以控制顯示的位置:


將 .ui 文件轉換成 .py 文件後新建 RunMainWinAbsoluteLayout.py 文件用來運行轉換之後的 .py 文件,發現出現報錯:

/home/thanlon/PycharmProjects/venv/pyqt5-pro/bin/python /home/thanlon/PycharmProjects/pyqt5-pro/2.QtDesigner/絕對布局/RunMainWinHorizontalLayout.py
Traceback (most recent call last):
File "/home/thanlon/PycharmProjects/pyqt5-pro/2.QtDesigner/絕對布局/RunMainWinHorizontalLayout.py", line 2, in <module>
import MainWinAbsoluteLayout
File "/home/thanlon/PycharmProjects/pyqt5-pro/2.QtDesigner/絕對布局/MainWinAbsoluteLayout.py", line 75, in <module>
from PyQt5 import QtWebKitWidgets
ImportError: cannot import name 'QtWebKitWidgets' from 'PyQt5' (/home/thanlon/PycharmProjects/venv/pyqt5-pro/lib/python3.8/site-packages/PyQt5/__init__.py)


可以使用 from PyQt5.QtWebEngineWidgets import * 替換 from PyQt5 import QtWebKitWidgets。

MainWinAbsoluteLayout.py:

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
...
# self.webView = QtWebKitWidgets.QWebView(self.centralwidget)
self.webView = QWebEngineView(self.centralwidget)
...

# from PyQt5 import QtWebKitWidgets
from PyQt5.QtWebEngineWidgets import *

RunMainWinAbsoluteLayout.py:

import sys
import MainWinAbsoluteLayout
from PyQt5.QtWidgets import QApplication, QMainWindow

if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個主窗口
mainWindow = QMainWindow()
# 創建Ui_MainWindow的實例
ui = MainWinAbsoluteLayout.Ui_MainWindow()
# 調用setupUi在指定窗口(主窗口)中添加控制項
ui.setupUi(mainWindow)
# 顯示窗口
mainWindow.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

2.11 布局中的間隔和分割線

間隔分為水平和垂直間隔,分別是 Horizontal Spacer 和 Vertical Spacer 兩個控制項。分割線也分為水平和垂直分割線,使用的控制項分別是 Horizontal Line 和 Vertical Line。分割線控制項可以讓兩個控制項之間有一條分割線,通常用分割線控制項將相同或類似功能的控制項放在一起,形成一個組。

RunMainWinSpacerLineLayout.py:

import sys

from PyQt5.QtWidgets import QApplication, QMainWindow
import MainWinSpacerLineLayout

if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個主窗口
mainWindow = QMainWindow()
# 創建Ui_MainWindow的實例
ui = MainWinSpacerLineLayout.Ui_MainWindow()
# 調用setupUi在指定窗口(主窗口)中添加控制項
ui.setupUi(mainWindow)
# 顯示窗口
mainWindow.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

2.12 控制項最大尺寸和最小尺寸

控制項最大尺寸和最小尺寸分別由控制項的 minimunmSize 和 maximumSize 屬性來設置的,

2.13 尺寸策略

每個控制項都有期望尺寸,每一個控制項的期望尺寸都是不一樣的。未設置控制項的最大值和最小值,推薦設置的尺寸,即建議尺寸。對大多數控制項,期望尺寸是固定值,不能夠去設置的。我們可以獲取控制項的期望尺寸:

RunMainWinSizePolicyLayout.py:

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
pass
# 列印pushButton控制項的期望尺寸
push_button_width = self.pushButton.sizeHint().width()
push_button_height = self.pushButton.sizeHint().height()
print('pushButton控制項期望尺寸的寬度:{}px'.format(push_button_width))
print('pushButton控制項期望尺寸的高度:{}px'.format(push_button_height))
"""
pushButton控制項期望尺寸的寬度:48px
pushButton控制項期望尺寸的高度:25px
"""
pass
# 列印line_Edit控制項的期望尺寸
line_Edit_width = self.lineEdit.sizeHint().width()
line_Edit_height = self.lineEdit.sizeHint().height()
print('lineEdit控制項期望尺寸的寬度:{}px'.format(line_Edit_width))
print('lineEdit控制項期望尺寸的高度:{}px'.format(line_Edit_height))
"""
lineEdit控制項期望尺寸的寬度:142px
lineEdit控制項期望尺寸的高度:25px
"""
pass
def retranslateUi(self, MainWindow):
pass

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

還有最小期望尺寸的概念,對於很多控制項期望尺寸和最小期望尺寸是一樣的,如 pushButton 控制項:

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
pass
# 列印pushButton控制項的最小期望尺寸
push_button_minimum_width = self.pushButton.minimumSizeHint().width()
push_button_minimum_height = self.pushButton.minimumSizeHint().height()
print('pushButton控制項最小期望尺寸的寬度:{}px'.format(push_button_minimum_width))
print('pushButton控制項最小期望尺寸的高度:{}px'.format(push_button_minimum_height))
"""
pushButton控制項最小期望尺寸的寬度:48px
pushButton控制項最小期望尺寸的高度:25px
"""
pass
def retranslateUi(self, MainWindow):
pass

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

也有不一樣的如 lineEdit 控制項:

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
pass
# 列印line_Edit控制項的最小期望尺寸
line_Edit_minimum_width = self.lineEdit.minimumSizeHint().width()
line_Edit_minimum_height = self.lineEdit.minimumSizeHint().height()
print('lineEdit控制項最小期望寬度:{}px'.format(line_Edit_minimum_width))
print('lineEdit控制項最小期望高度:{}px'.format(line_Edit_minimum_height))
"""
lineEdit控制項最小期望寬度:59px
lineEdit控制項最小期望高度:25px
"""
pass
def retranslateUi(self, MainWindow):
pass

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

尺寸策略的應用,使用常用的屬性值 Expanding:


RunMainWinExpendingLayout.py:

import sys

from PyQt5.QtWidgets import QApplication, QMainWindow
import MainWinExpandingLayout

if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個主窗口
mainWindow = QMainWindow()
# 創建Ui_MainWindow的實例
ui = MainWinExpandingLayout.Ui_MainWindow()
# 調用setupUi在指定窗口(主窗口)中添加控制項
ui.setupUi(mainWindow)
# 顯示窗口
mainWindow.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

2.14 設置控制項之間的夥伴關係

把兩個控制項關聯到一起,通過其中一個控制項控制另外一個控制項。使用 Form Layout 布局在裡面添加 Label 和 Line Edit 空間,


預覽後同時按鍵盤中的 「ALT」和「A」 滑鼠會定位到姓名的文本框中。同理,「ALT」和「B」 滑鼠會定位到年齡的文本框中。

RunMainWinBuddyLayout.py:

import sys
import MainWinBuddyLayout
from PyQt5.QtWidgets import QApplication, QMainWindow

if __name__ == '__main__':
# 創建QApplication類的實例
app = QApplication(sys.argv)
# 創建一個主窗口
mainWindow = QMainWindow()
# 創建Ui_MainWindow的實例
ui = MainWinBuddyLayout.Ui_MainWindow()
# 調用setupUi在指定窗口(主窗口)中添加控制項
ui.setupUi(mainWindow)
# 顯示窗口
mainWindow.show()
# 進入程序的主循環,並通過exit函數確保主循環安全結束
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

2.15 修改控制項的Tab順序

控制項布局好之後,如果是要求用戶輸入的控制項,可以使用 Tab 鍵進行切換。實際上使用 Tab 鍵切換默認是按照控制項添加順序,當然還可以修改控制項的 Tab 順序。修改控制項的 Tab 順序有兩種方法,方法一:選擇 Edit --> 編輯 Tab 順序:

雙擊序號可切換序號:

也可以選中序號,右鍵選擇」制表符順序列表「來調整順序:

2.16 信號與槽的設置

信號(signal)與槽(slot)是 QT 的核心機制,也是 PyQt 的核心機制。信號:對象或者控制項發出去的消息。單擊一個按鈕的時候按鈕就會向外部發送單擊的消息,這些發送出去的信號需要一些代碼來攔截,這些代碼就是槽。槽的本質是函數或方法,單擊一個按鈕其實就是執行了槽所對應的函數或方法,這個函數或方法本質上就相當於這個按鈕的單擊事件。

簡單理解就是:信號就是一個單擊事件,槽就是單擊事件所對應的事件函數。一個信號可以和多個槽綁定,一個槽可以攔截多個信號。

下面使用 QtDesigner 來完成信號與槽的綁定:

選擇編輯信號/槽,為 「關閉窗口」 按鈕添加點擊事件,槽為 close( ) 函數:

預覽之後,點擊按鈕會關閉窗口:

例子1:控制文本輸入框的顯示和隱藏


預覽後的效果:


例子2:控制文本輸入框是否可用


預覽後的效果:

2.17 添加菜單和工具欄

使用 QtDesigner 創建一個主窗口時,默認會在主窗口的上方添加一行菜單欄,在最下方添加一行狀態欄。如果我們需要添加工具欄則需要單擊右鍵選擇【添加工具欄】,這部分主要探討如何在窗口中創建菜單和工具欄以及分別向菜單欄、工具欄中添加菜單項、按鈕。

默認菜單已經創建,所以只需要為菜單添加菜單項:

創建工具欄並且將按鈕添加到工具欄中:

3. PyQt5核心API的使用3.1 創建主窗口

有三種類型的窗口,分別是 QMainWindow、QDialog 和 QWidget。QMainWindow:可以包括菜單欄、工具欄、狀態欄和標題欄,是最常見的窗口形式。QDialog:是對話窗口的基類。沒有菜單欄、工具欄、標題欄。QWidget:不確定窗口的類型,就可以使用 QWidget。創建一個主窗口:

FirstMainWindow.py:

"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: FirstMainWindow.py
@time: 2020/11/17 上午9:50
"""
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtGui import QIcon

class FirstMainWin(QMainWindow):
def __init__(self):
"""
初始化
:param parent:控制項放到parent
"""
super(FirstMainWin, self).__init__()
# 設置主窗口的標題
self.setWindowTitle('第一個窗口應用')
# 設置窗口的尺寸
self.resize(400, 300)
# 獲取當前的狀態欄(默認是有狀態欄的)
self.status = self.statusBar()
# 設置狀態欄顯示的消息(消息只存在5s)
self.status.showMessage('只顯示5s的消息!', 5000)

if __name__ == '__main__':
# 創建一個應用程式對象(傳入參數)
app = QApplication(sys.argv)
# 設置應用程式的圖標
app.setWindowIcon(QIcon('../images/Dragon.ico'))
# 創建窗口類的對象
main = FirstMainWin()
# 顯示窗口
main.show()
# 調用exit()進入程序的主循環
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

3.2 主窗口居中顯示

PyQt5中沒有API直接讓窗口居中,所以需要自己去寫。主窗口居中顯示需要計算窗口的左上角的坐標值,橫坐標可以通過屏幕的寬度減去窗口的寬度除以2,縱坐標可以通過屏幕的高度減去窗口的高度除以2。完成計算後可以使用move方法移動窗口。

CenterWindow.py:

"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: FirstMainWindow.py
@time: 2020/11/17 上午9:50
"""
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QDesktopWidget
from PyQt5.QtGui import QIcon

class CenterMainWin(QMainWindow):
def __init__(self):
"""
初始化
:param parent:控制項放到parent
"""
super(CenterMainWin, self).__init__()
# 設置主窗口的標題
self.setWindowTitle('窗口居中')
# 設置窗口的尺寸
self.resize(400, 300)
# 獲取當前的狀態欄(默認是有狀態欄的)
self.status = self.statusBar()
# 設置狀態欄顯示的消息(消息只存在5s)
self.status.showMessage('只顯示5s的消息!', 5000)

def center(self):
# 獲取屏幕坐標系
screen = QDesktopWidget().screenGeometry()
# 獲取窗口坐標系
size = self.geometry()
left = (screen.width() - size.width()) / 2
top = (screen.height() - size.height()) / 2
# 移動窗口
self.move(left, top)

if __name__ == '__main__':
# 創建一個應用程式對象(傳入參數)
app = QApplication(sys.argv)
# 設置應用程式的圖標
app.setWindowIcon(QIcon('../images/Dragon.ico'))
# 創建窗口類的對象
main = CenterMainWin()
# 顯示窗口
main.show()
# 窗口居中
main.center()
# 調用exit()進入程序的主循環
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

3.3 退出應用程式

退出應用程式,即退出整個窗口,

QuitApplication.py:

"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: QuitApplication.py
@time: 2020/11/17 上午10:48
"""
import sys
from PyQt5.QtWidgets import QMainWindow, QPushButton, QHBoxLayout, QWidget, QApplication


class QuitApplication(QMainWindow):
def __init__(self):
super(QuitApplication, self).__init__()
self.resize(300, 150)
self.setWindowTitle('退出應用程式')
# 添加按鈕
self.buttion1 = QPushButton('退出應用程式')
# 將信號與槽關聯。信號綁定到方法,每一個信號都有一個connect方法
self.buttion1.clicked.connect(self.onClickButton)
# 設置水平布局(將按鈕放到布局中)
layout = QHBoxLayout()
layout.addWidget(self.buttion1)
# 把布局放到QWidget(所有的控制項都放到Qwiget,Qwiget可以充滿整個窗口)
main_frame = QWidget()
main_frame.setLayout(layout)
# 框架放到窗口上
self.setCentralWidget(main_frame)

def onClickButton(self):
# 通過sender獲取button
sender = self.sender()
# 獲取button的文本
print(sender.text() + ' 按鈕被按下!')
# 創建應用程式對象
app = QApplication.instance()
# 退出應用程式
app.quit()

if __name__ == '__main__':
app = QApplication(sys.argv)
main = QuitApplication()
main.show()
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45


3.4 屏幕坐標系

窗口的位置可以通過窗口的左上角的坐標來描述,這個坐標就是相對於屏幕坐標系。我們可以獲取窗口相關的一系列參數:

"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: ScreenGeometry.py
@time: 2020/11/17 上午11:15
"""
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton


def on_click_btn():
"""
單擊button列印窗口的坐標和寬度和高度
:return:
"""
print('onclick')
print('-1-')
print('widget.x() = %d' % widget.x()) # 窗口橫坐標
print('widget.y() = %d' % widget.y()) # 窗口縱坐標
print('widget.width() = %d' % widget.width()) # 工作區寬度
print('widget.height() = %d' % widget.height()) # 工作去高度
print('-2-')
print('widget.geometry().x() = %d' % widget.geometry().x()) # 工作區橫坐標
print('widget.geometry().y() = %d' % widget.geometry().y()) # 工作區縱坐標
print('widget.geometry().width() = %d' % widget.geometry().width()) # 工作區寬度
print('widget.geometry().height() = %d' % widget.geometry().height()) # 工作區高度
print('-3-')
print('widget.geometry().x() = %d' % widget.frameGeometry().x()) # 窗口橫坐標
print('widget.geometry().y() = %d' % widget.frameGeometry().y()) # 窗口縱坐標
print('widget.geometry().width() = %d' % widget.frameGeometry().width()) # 窗口寬度
print('widget.geometry().height() = %d' % widget.frameGeometry().height()) # 窗口高度(包括標題欄)


if __name__ == '__main__':
app = QApplication(sys.argv)
# 使用Qwigit創建窗口
widget = QWidget()
# 在窗口放按鈕
btn = QPushButton(widget)
# 設置按鈕的文本
btn.setText('按鈕')
# 設置按鈕相對於窗口(工作區)的位置
btn.move(10, 10)
# 綁定槽
btn.clicked.connect(on_click_btn)
# 設置工作區的尺寸
widget.resize(300, 300)
# 設置窗口的坐標(對於屏幕的位置)
widget.move(200, 200)
# 設置窗口標題欄文字
widget.setWindowTitle('屏幕坐標系')
# 顯示窗口
widget.show()
# 進入事件循環
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57


窗口相對於坐標系的位置和尺寸,側面可以得到標題欄的高度是31px。

3.5 設置窗口和應用程式圖標

使用 setWindowIcon 方法來設置圖標,窗口的 setWindowIcon 方法用於設置窗口的圖標,只在 Windows 中可用,只能在標題欄左上角顯示圖標。QApplication 中的 setWindowIcon 方法可以用來設置主窗口的圖標和應用程式的圖標,但是如果主窗口已經設置了的圖標,這裡只能用於設置應用程式的圖標。

"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: WinAndApplicationIcon.py.py
@time: 2020/11/17 上午11:33
"""
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtGui import QIcon


class WinAndApplicationIcon(QMainWindow):
def __init__(self):
super(WinAndApplicationIcon, self).__init__()
self.init_ui()

def init_ui(self):
# 設置主窗口的標題
self.setWindowTitle('設置窗口圖標')
# 同時設置主窗口的尺寸和位置
self.setGeometry(400, 400, 300, 200)
# 設置窗口圖標
self.setWindowIcon(QIcon('../images/Basilisk.ico'))

if __name__ == '__main__':
# 創建一個應用程式對象(傳入參數)
app = QApplication(sys.argv)
# 設置應用程式的圖標
app.setWindowIcon(QIcon('../images/Dragon.ico')) # 可以用來設置主窗口的圖標和應用程式的圖標,但是如果主窗口已經設置了的圖標,這裡只能用於設置應用程式的圖標
# 創建窗口類的對象
main = WinAndApplicationIcon()
# 顯示窗口
main.show()
# 調用exit()進入程序的主循環
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

3.6 控制項添加提示消息

當滑鼠放在控制項上的時候,可以顯示提示消息。使用 setToolTip 方法設置的消息內容支持富文本。

"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: ToolTip.py
@time: 2020/11/17 上午11:39
"""
import sys
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QMainWindow, QToolTip, QHBoxLayout, QWidget, QPushButton, QApplication


class ToolTip(QMainWindow):
def __init__(self):
super(ToolTip, self).__init__()
self.init_ui()

def init_ui(self):
QToolTip.setFont(QFont('SansSerif', 12))
self.setToolTip('你好,<b>Erics</b>')
self.setGeometry(300, 300, 300, 150)
self.setWindowTitle('設置控制項提示消息')

self.button1 = QPushButton('按鈕')
self.button1.setToolTip('這是一個按鈕!')
layout = QHBoxLayout()
layout.addWidget(self.button1)
main_frame = QWidget()
main_frame.setLayout(layout)
self.setCentralWidget(main_frame)


if __name__ == '__main__':
app = QApplication(sys.argv)
tool_tip = ToolTip()
tool_tip.show()
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

4. PyQt5中常用控制項API的使用4.1 QLabel控制項的基本用法

QLabel 控制項是用來顯示文本信息的,QLabel 控制項相關的方法如下:

方法名說明setAlignment()設置文本的對齊方式setIndent()設置文本縮進text()獲取文本內容setBuddy()設置夥伴關係setText()設置文本內容selectedText()返回所選的字符setWordWrap()設置是否允許換行

QLabel 控制項常用的信號(事件)

信號說明linkHoverd當滑鼠滑過QLabel控制項時觸發linkActivated當滑鼠單擊QLabel控制項時觸發

"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: QLabelDemo.py
@time: 2020/11/17 下午5:56
"""
import sys
from PyQt5.QtGui import QPalette, QPixmap
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QLabel, QVBoxLayout, QApplication

class QLabelDemo(QWidget):
def __init__(self):
super().__init__()
# 初始化窗口界面
self.init_ui()

def init_ui(self):
# 創建4個QLabel控制項
label1 = QLabel(self)
label2 = QLabel(self)
label3 = QLabel(self)
label4 = QLabel(self)
# 設置label1文本(支持html標籤)
label1.setText('<font color="orange">這是一個文本標籤</font>')
# 創建調色板
palette = QPalette()
palette.setColor(QPalette.Window, Qt.blue) # 設置控制項的背景色
# 設置label1使用創建的調色板(設置label1控制項的背景色)
label1.setPalette(palette)
# 設置label1自動填充背景
label1.setAutoFillBackground(True)
# 設置label1居中對齊
label1.setAlignment(Qt.AlignCenter)

# 設置label2的文本
label2.setText('<a href="#">歡迎你使用Python GUI程序!</a>') # 跳轉網頁或者是點擊事件
# 設置label2文本居中
label3.setAlignment(Qt.AlignCenter)
# 設置提示信息
label3.setToolTip('這是一個圖片標籤!')
# 設置標籤下顯示圖片
label3.setPixmap(QPixmap('../images/python.jpg'))

# 設置label4的文本
label4.setText('<a href="https://pythoneers.cn">感謝您訪問我的網站!</a>')
# 屏蔽事件(點擊之後打開網頁,而不是觸發事件)
label4.setOpenExternalLinks(True) # False是響應事件
# 設置label4右對齊
label4.setAlignment(Qt.AlignRight)
# 設置提示信息
label4.setToolTip('這是一個超連結!')

# 創建垂直布局對象
vbox = QVBoxLayout()
# 將label1、label2、label2、label3控制項添加到布局中
vbox.addWidget(label1)
vbox.addWidget(label2)
vbox.addWidget(label3)
vbox.addWidget(label4)

# 滑過label2標籤的信號綁定到槽(函數)
label2.linkHovered.connect(self.linkHovered)
# 點擊label4標籤的信號綁定槽(函數)
label4.linkActivated.connect(self.linkClicked)
# 設置窗口的布局
self.setLayout(vbox)
# 設置窗口標題
self.setWindowTitle('QLabel控制項演示')

def linkHovered(self):
"""
當滑鼠划過標籤label2時觸發事件
:return:
"""
print('當滑鼠划過標籤label2時觸發事件')

def linkClicked(self):
"""
當滑鼠單擊標籤label4時觸發事件
:return:
"""
print('當滑鼠單擊標籤label4時觸發事件')

if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = QLabelDemo()
mainWindow.show()
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

4.2 QLabel與夥伴控制項

這裡使用代碼設置夥伴控制項如下:

QLabelBuddy.py:

"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: QLabelBuddy.py
@time: 2020/11/17 下午6:26
"""
import sys
from PyQt5.QtWidgets import QDialog, QLabel, QLineEdit, QPushButton, QGridLayout, QApplication

class QLabelBuddy(QDialog):
def __init__(self):
super().__init__()
# 初始化實例的時候執行
self.init_ui()

def init_ui(self):
# 設置窗口標題欄文本
self.setWindowTitle('QLabel與夥伴控制項')
# 創建QLabel控制項
nameQLabel = QLabel('&Name', self)
# 創建QLineEdit控制項
nameQLineEdit = QLineEdit(self)
# 設置夥伴控制項
nameQLabel.setBuddy(nameQLineEdit)
# 創建QLabel控制項
passwordQLabel = QLabel('&Pwd', self)
# 創建QLineEdit控制項
passwordQLineEdit = QLineEdit(self)
# 設置夥伴控制項
passwordQLabel.setBuddy(passwordQLineEdit)
ok_btn = QPushButton('&OK')
cancel_btn = QPushButton('&Cancel')
# 創建柵格布局
mainLayout = QGridLayout(self)
# 將nameQLabel添加到柵格布局中
mainLayout.addWidget(nameQLabel, 0, 0)
# 將nameQLineEdit添加到柵格布局中
mainLayout.addWidget(nameQLineEdit, 0, 1, 1, 2)
# 將passwordQLabel添加到柵格布局中
mainLayout.addWidget(passwordQLabel, 1, 0)
# 將passwordQLineEdit添加到柵格布局中
mainLayout.addWidget(passwordQLineEdit, 1, 1, 1, 2)
# 將ok_btn添加到布局中
mainLayout.addWidget(ok_btn, 2, 1)
# 將cancel_btn添加到布局中
mainLayout.addWidget(cancel_btn, 2, 2)
"""
行索引rowIndex和列索引columnIndex是控制項在柵格布局中位置,佔用的行數row和佔用的列數column是控制項的尺寸
mainLayout.addWidget(控制項對象, 行索引rowIndex, 列索引columnIndex, 佔用的行數row, 佔用的列數column)
"""

if __name__ == '__main__':
app = QApplication(sys.argv)
QLabel_Buddy = QLabelBuddy()
QLabel_Buddy.show()
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

4.3 QLineEdit控制項與回顯模式

QLineEdit 控制項的基本功能是輸入單行文本,這個控制項還有其它高級內容,如設置回顯模式、掩碼。回顯有4種模式:

QLineEditEchoMode.py:

"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: QLineEditEchoMode.py
@time: 2020/11/24 上午4:06
"""
import sys
from PyQt5.QtWidgets import QWidget, QFormLayout, QLineEdit, QApplication


class QLineEditEchoMode(QWidget):
def __init__(self):
super(QLineEditEchoMode, self).__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('文本輸入框的回顯模式')
# 創建表單布局對象
formLayout = QFormLayout()
# 創建四個LineEdit控制項
normalLineEdit = QLineEdit()
noEchoLineEdit = QLineEdit()
passwordLineEdit = QLineEdit()
passwordEchoOnEdit = QLineEdit()
# 將空間添加到布局中
formLayout.addRow('Normal', normalLineEdit)
formLayout.addRow('NoEcho', noEchoLineEdit)
formLayout.addRow('Password', passwordLineEdit)
formLayout.addRow('PasswordEchoEdit', passwordEchoOnEdit)
# 設置默認的文本提示內容(類似於設置HTML表單中的Placeholder屬性)
normalLineEdit.setPlaceholderText('Normal')
noEchoLineEdit.setPlaceholderText('NoEcho')
passwordLineEdit.setPlaceholderText('Password')
passwordEchoOnEdit.setPlaceholderText('PasswordEchoOnEdit')
# 設置回顯模式
normalLineEdit.setEchoMode(QLineEdit.Normal)
noEchoLineEdit.setEchoMode(QLineEdit.NoEcho)
passwordLineEdit.setEchoMode(QLineEdit.Password)
passwordEchoOnEdit.setEchoMode(QLineEdit.PasswordEchoOnEdit)
# 應用表單布局
self.setLayout(formLayout)


if __name__ == '__main__':
app = QApplication(sys.argv)
main = QLineEditEchoMode()
main.show()
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

4.4 QLineEdit控制項的校驗器

通過校驗器可以限制文本輸入控制項的輸入,如限制只能輸入整數、浮點數或滿足一定條件的字符串。

QLineEditEchoMode.py:

"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: QLineEditValidator.py
@time: 2020/11/24 上午5:14
"""
from PyQt5.QtWidgets import QWidget, QFormLayout, QLineEdit, QApplication
from PyQt5.QtGui import QIntValidator, QDoubleValidator, QRegExpValidator
from PyQt5.QtCore import QRegExp # 引入正則表達式的類
import sys

class QLineEditValidator(QWidget):
def __init__(self):
super(QLineEditValidator, self).__init__()
self.initUI()

def initUI(self):
self.setWindowTitle('QLineEdit控制項的校驗器')
# 創建表單布局對象
formLayout = QFormLayout()
# 創建三個QLineEdit控制項
intLineEdit = QLineEdit()
doubleLineEdit = QLineEdit()
validatorLineEdit = QLineEdit()
# 將控制項添加到布局中
formLayout.addRow('整數類型', intLineEdit)
formLayout.addRow('浮點類型', doubleLineEdit)
formLayout.addRow('字母和數字(正則表達式)', validatorLineEdit)
# 為QLineEdit控添默認提示內容
intLineEdit.setPlaceholderText('整數')
doubleLineEdit.setPlaceholderText('浮點')
validatorLineEdit.setPlaceholderText('字母和數字')
"""
1.設置整數校驗器(只能輸入[1,99]之間的整數)
"""
# 創建QDoubleValidator校驗器對象
intValidator = QIntValidator(self)
# 設置校驗範圍
intValidator.setRange(1, 99)
"""
2.設置浮點校驗器(只能輸入[-99.xx,99.xx],精度要求保留小數點後2位)
"""
# 創建QDoubleValidator校驗器對象
doubleValidator = QDoubleValidator(self)
# 設置校驗範圍
doubleValidator.setRange(-99, 99)
# 正常顯示浮點數
doubleValidator.setNotation(QDoubleValidator.StandardNotation)
# 設置精度,保留小數點後兩位
doubleValidator.setDecimals(2)
"""
3.設置字母和數字(正則表達式)校驗器
"""
# 正則表達式
reg = QRegExp('[a-zA-Z0-9]+$')
# 正則表達式校驗器
validator = QRegExpValidator(self)
# 將正則表達式和正則表達式校驗器綁定到一起
validator.setRegExp(reg)
"""
設置校驗器:綁定校驗器和控制項
"""
intLineEdit.setValidator(intValidator)
doubleLineEdit.setValidator(doubleValidator)
validatorLineEdit.setValidator(validator)
# 應用表單布局
self.setLayout(formLayout)

if __name__ == '__main__':
app = QApplication(sys.argv)
main = QLineEditValidator()
main.show()
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75


4.5 使用掩碼限制QLineEdit控制項的輸入掩碼說明AASCII字母字符必須輸入(A-Z、a-z)aASCII字母字符允許但不是必須輸入(A-Z、a-z)NASCII字母和數字字符必須輸入(A-Z、a-z 、0-9)nASCII字母和數字字符允許但不是必須輸入(A-Z、a-z 、0-9)X任何字符都必須輸入x任何字符允許但不是必須輸入9ASCII數字字符必須輸入(0-9)0ASCII數字字符允許但不是必須輸入(0-9)DASCII數字字符必須輸入(1-9)dASCII數字字符允許但不是必須輸入(1-9)#ASCII數字字符或加減符號允許但不是必須輸入H十六進位格式字符必須輸入(A-F,a-f,0-9)h十六進位格式允許但不是必須輸入(A-F,a-f,0-9)B二進位格式字符是必須輸入(0,1)b二進位格式字符允許但不是必須輸入(0,1)>所有的字母字符都大寫<所有的字母字符都小寫!關閉大小寫轉換\使用\轉義上面列出的字符

QLineEditMask.py:

"""
@from:https://pythoneers.cn
@author: qq3330447288
@contact: erics1996@yeah.net
@software: PyCharm
@file: QLineEditMask.py
@time: 2020/11/25 下午11:41
"""
from PyQt5.QtWidgets import QWidget, QApplication, QFormLayout, QLineEdit
import sys


class QLineEditMask(QWidget):
def __init__(self):
# 調用父類QWidget的__init__方法
super(QWidget, self).__init__()
# 調用類的實例方法初始化窗口界面
self.initUI()

def initUI(self):
# 設置窗口標題
self.setWindowTitle('5.掩碼限制QLineEdit控制項的輸入')
# 創建表單布局
formLayout = QFormLayout()
# 創建QLineEdit控制項
ipLineEdit = QLineEdit()
macLineEdit = QLineEdit()
dateLineEdit = QLineEdit()
licenseLineEdit = QLineEdit()
# 設置掩碼規則(ASCII數字字符允許但不是必須輸入0-9),沒有輸入時顯示下劃線
ipLineEdit.setInputMask('000,000,000,000;_')
# 置掩碼規則( 十六進位格式允許但不是必須輸入A-F,a-f,0-9),沒有輸入時顯示下劃線
macLineEdit.setInputMask('HH:HH:HH:HH:HH:HH;_')
# 置掩碼規則(ASCII數字字符允許但不是必須輸入0-9),沒有輸入時顯示下劃線
dateLineEdit.setInputMask('0000-00-00;_')
# 置掩碼規則(ASCII字母字符必須輸入A-Z、a-z,如果輸入a-z則小寫轉大寫),沒有輸入時顯示#號
licenseLineEdit.setInputMask('>AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#')
# 將QLineEdit控制項添加到表單布局中
formLayout.addRow('ip地址', ipLineEdit)
formLayout.addRow('mac地址', macLineEdit)
formLayout.addRow('日期', dateLineEdit)
formLayout.addRow('序列號', licenseLineEdit)
# 設置窗口的布局為表單布局
self.setLayout(formLayout)


if __name__ == '__main__':
# 創建應用程式對象
app = QApplication(sys.argv)
# 創建窗口類的對象
mainWindow = QLineEditMask()
# 顯示窗口
mainWindow.show()
# 調用exit()進入程序的主循環
sys.exit(app.exec_())

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

到此這篇關於詳解Python GUI編程之PyQt5入門到實戰的文章就介紹到這了

‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

掃描下方微信,加作者微信進技術交流群,請先自我介紹喔。

關注微信公眾號『技術讓夢想更偉大』,後臺回復「m」查看更多內容。

長按前往圖中包含的公眾號關注

相關焦點

  • Python高級進階 007 pyqt5消息盒子QMessageBox
    一、知識回顧1.使用類進行pyqt5的gui開發封裝2.使用setGeometry函數:大小、位置3.掌握類的繼承與內部調用本節知識視頻教程利用傳過來的事件對象我們通過輸出的形式,看到事件對象的屬性和方法,猜測到具體的調用方法。
  • python gui 中三大框架tkinter,wxpython, pyqt如何選擇
    python開發圖形界面也有這樣的煩惱,有很多gui框架提供我們選擇,讓我們眼花繚亂,我們很難從中選擇一個。下面我簡單介紹下主流的三個python gui框架。pyqt5是一套Python綁定Digia QT5應用的框架。它可用於Python 2和3。Qt庫是最強大的GUI庫之一。
  • python高級進階 002第一個pyqt5程序
    瀏覽器版本過低,暫不支持視頻播放以下開始文字講解:在上一節的教程中,我們已經將圖形化界面開發的基本環境已經搭建完畢,本節,我們繼續使用pyqt5app.exec_()主要作用是用死循環來監聽界面的關閉按鈕等界面控制項等事件__name__在本文件運行的時候,結果就是__main__使用__name__==『__main__『來模擬python程序主入口為了使得我們能夠對qtdesigner設計後生成的代碼更加熟悉,我們今後會更多直接使用純pyqt5代碼來編寫程序,當然,在熟悉以後,我們可以直接使用qtdesigner直接快速圖形化開發界面
  • python辦公自動化:PyAutoGUI入門秘笈一
    學好PyAutoGUI,讓機器幫你幹活就能實現這麼舒爽的目標有同學看了以前對python辦公自動化:讓PyAutoGUI來幫你幹活,很感興趣,開始動手實踐。但是遇到很多問題,怎麼能讓大家能更快的入門PyAutoGUI呢,特地準備了以下系列,從入門到使用技巧,對PyAutoGUI做了全方位的解讀。
  • Python快速入門的方法
    現在如果有人問:要把哪門語言作為入門的首選語言?不少人都會回答:Python!因為Python簡單,所以學起來快,有編程經驗的程式設計師一周就能上手Python。但是!Python對有基本的程序概念的人來說很簡單,但對於新手來說真不一定算簡單。
  • python編程教程視頻公眾號教學
    爬蟲框架,以及flaskweb框架,另外也包含了python實戰的一些知識點。 Python學習手冊,講解了python基礎知識,也介紹了Scrapy爬蟲框架,以及flaskweb框架,另外也包含了python實戰的一些知識點。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    網絡爬蟲 26機器學習入門篇 27機器學習入門篇2 28機器學習提升篇 29數據挖掘篇 30深度學習必備原理與實戰 31深度學習必備原理與實戰2 32深度學習必備原理與實戰3 33深度學習必備原理與實戰4 34深度學習項目實戰 35深度學習項目實戰2
  • python初學者必看的學習路線 Python是近幾年比較火的程式語言
    Python是近幾年比較火的程式語言之一,因為人工智慧的火爆,讓很多人都想從事python開發。很多零基礎學員在學習python的時候都會走一些彎路,下面小編就為大家分享python學習路線圖,幫助零基礎學員在學習的時候少走彎路。 很多人都在問Python學習步驟應該如何安排?
  • Linux 平臺下 Python 腳本編程入門(一)
    在 Linux 中學習 Python 腳本編程首先,我們會使用 Python 的命令行工具,還會接觸到 Python 的面向對象特性(這篇文章的後半部分會談到它)。學習 Python 可以助力於你在桌面應用開發[1]及數據科學領域[2]的職業發展。
  • 如何入門Python之Python基礎教程詳解
    隨著人工智慧的發展,Python近兩年也是大火,越來越多的人加入到Python學習大軍,對於毫無基礎的人該如何入門Python呢?這裡整理了一些個人經驗和Python入門教程供大家參考。如果你是零基礎入門 Python 的話,建議初學者至少達到兩個目標: 會用,理解。
  • Python高級編程、科學計算等多本數據分析書籍推薦!
    001 Python從入門到實踐    002 流暢的python    003 統計自然語言處理    004 計量經濟分析第6版    005 Machine Learning   088 人人都會數據分析:從生活實例學統計    089 Effective Python(2)    090 java從入門到精通(第4版)    091 java從小白到大牛
  • 「技術文章」《Python 資料庫 GUI CGI編程》
    1.寫在前邊上一次,我們介紹了Python的入門的文章,今天我們就來介紹下Python的資料庫,GUI, CGI的編程,以及Python 2.x 與Python 3.x的區別。2.連接資料庫 Python 標準資料庫接口為 Python DB-API,MySQLdb 是用於Python連結Mysql資料庫的接口。
  • PyAutoGUI:自動化鍵鼠操作的Python類庫
    然後運行下面的代碼,然後切換到畫圖窗口。等待3秒鐘以後就可以看到PyAutoGUI開始畫圖了。import pyautoguidistance = 100pyautogui.moveTo(400, 300)while distance > 0: pyautogui.drag(distance, 0, duration=0.1) distance -= 5 pyautogui.drag(0, distance, duration=0.1)
  • 入門Python, 看這些資料就夠了
    最後,平時有空可以看看awesome-python-cn和python-tip上的內容,作為入門之外的擴展,開闊自己的視野【實驗樓Python3教程】連結:Python3 簡明教程 (https://www.shiyanlou.com/courses/596)簡介: 提供了開箱即用的實驗環境 ,省去了搭建環境的麻煩。 偏重實戰。
  • 廖雪峰老師的Python商業爬蟲課程 Python網絡爬蟲實戰教程 體會不一樣的Python爬蟲課程
    》.pdf├─(63) 父與子的編程之旅.pdf├─(64) 用Python寫網絡爬蟲.pdf(35)\資料\課件\python環境和pychram;目錄中文件數:4個├─(65) 1安裝Python.pdf├─(66) pycharm安裝.pdf├─(67) pychram激活方法.docx├─(68) 離線激活碼方式.txt(36)
  • C 語言C++ 教程視頻編程入門到精通視頻課程
    ANSYS Workbench有限元分析視頻教程/培訓教程資料/結構優化(53G)浙江省專升本高等數學大學英語文輔導教程視頻教程資料歷年真題卷化妝教程零基礎步驟課程學彩妝自學護膚職場美妝技巧培訓畫眉視頻uni-app開發教程項目實戰小程序基礎入門商業項目uniapp視頻教程零基礎自學Ai服裝設計視頻教程電腦軟體款式圖網絡課程圖案設計
  • python製作簡單的圖形化應用(easygui)
    使用python更簡單的圖形化庫easygui實現簡單的圖形化的入門應用!
  • Python入門教程小孩兒都能學會的零基礎Python學習教程
    本學習路線共分為9個部分(如圖-1):Python語言基礎的學習,掌握python的核心語法;玩轉Linux作業系統,掌握如何使?雲伺服器和Linux作業系統;資料庫入門到實戰,掌握傳統的關係型資料庫以及新興的?關係型資料庫產品的使??法;輕鬆搞定web前端,掌握前端開發最核?
  • python編程入門,零基礎學習Python基礎教程
    這裡推薦這門python編程入門基礎教程,適合零基礎的同學學習!python軟體工程師都學什麼?自學Python,看視頻學的更快、更透徹一些,給你個課程大綱!階段二:Python高級編程和資料庫開發Python全棧開發與人工智慧之Python高級編程和資料庫開發知識學習內容包括:面向對象開發、Socket網絡編程、線程、進程、隊列、IO多路模型、Mysql資料庫開發等。
  • Python推薦書籍從入門到進階(珍藏版)
    《Python編程:從入門到實踐》本書的講解很到位,不過就是在對一些簡單知識點的講解方面投入了過多的筆墨。《Python編程初學者指南》本書語句活潑,非常適合入門學習,不僅能學到Python的知識,更能培養編程的興趣。以遊戲作為引導和切入點4.