作者簡介:大家好我是五維星空,目前是某國企的一名Java全棧程序員,熱愛技術、喜歡代碼,希望我的文章能給大家帶來收獲。
個人主頁:五維星空的csdn博客
系列專欄:Python QtGUI與可視化編程
如果覺得博主的文章還不錯的話,請三連支持一下博主哦!
或微信搜索“五維星空”關注我吧~
參考書目:《Python QtGUI與數據可視化編程》
點擊鏈接直接下載Python3.10版本:https://www.python.org/ftp/python/3.10.4/python-3.10.4-amd64.exe
下載太慢?微信搜索“五維星空”,發送“python安裝包”獲取網盤下載地址。
下載後雙擊啟動安裝程序即可(記得勾選add to path)。
打開cmd
執行pip3 install pyqt5
。
又慢?換源大法送上。如下命令是替換為中科大的源。
pip install pip -U #升級 pip config set global.index-url https://pypi.mirrors.ustc.edu.cn/simple/ #換源
這個東西主要是用來設計界面的,沒錯,就是拖拽控件生成界面,之後執行命令將其轉換成Python代碼。(喜歡手敲的大佬可以跳過這個工具,over~)
點擊鏈接直接下載Qtdesigner Windows版本:https://build-system.fman.io/static/public/files/Qt%20Designer%20Setup.exe
又又又慢?微信搜索“五維星空”,發送“QtDesigner安裝包”獲取網盤下載地址。
下載後雙擊啟動安裝程序即可。
基礎不牢、語法不會?**問題不大。毛主席都說了,實踐是檢驗真理的唯一標准。**來寫一個HelloWorld吧
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
if __name__ == '__main__':
# 創建APP
app = QtWidgets.QApplication(sys.argv)
# 創建窗體
mainFrame = QtWidgets.QWidget()
# 設置窗體大小
mainFrame.resize(800, 200)
# 設置窗體標題
mainFrame.setWindowTitle("HelloWorld")
# 將Label組件綁定到mainFrame上,並設置內容
labelHello = QtWidgets.QLabel(mainFrame)
labelHello.setText("Hello World!By 五維星空~")
# 設置字體
font = QtGui.QFont()
# 字體加粗
font.setBold(True)
# 字體大小
font.setPixelSize(26)
labelHello.setFont(font)
# 計算Label的合適大小並返回QSize對象
size = labelHello.sizeHint()
# 設置labelHello的坐標以及寬高
labelHello.setGeometry(250, 100, size.width(), size.height())
# 運行時顯示對話框
mainFrame.show()
# 啟動應用程序
sys.exit(app.exec_())
運行結果:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-nkfS12K4-1655217489235)(D:\WorkSpace\markdown\書\image\image-20220604100945081.png)]
在2.1節我們一起寫了一個簡單的HelloWorld
程序(沒搞懂?問題不大,後面敲著敲著就懂了),本節我們使用QtDesigner
來做同樣的事情。在此之前,我們先通過下面這幅圖簡單了解一下QtDesigner
的界面。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-THJKQHan-1655217489236)(D:\WorkSpace\markdown\書\image\image-20220604104550848.png)]
好了,接下來正式開始本節的內容。
打開QtDesigner,按照下圖創建程序。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mGwE7yey-1655217489237)(D:\WorkSpace\markdown\書\image\image-20220604101808796.png)]
找到windowTitle屬性,輸入窗口標題
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-9yLICjgD-1655217489237)(D:\WorkSpace\markdown\書\image\image-20220604101951714.png)]
找到Label組件,拖拽至窗體位置
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-RFmrZ1b1-1655217489238)(D:\WorkSpace\markdown\書\image\image-20220604102127120.png)]
雙擊進入編輯模式,輸入HelloWorld! By 五維星空~
,調整至合適大小。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4Cz3dnTc-1655217489238)(D:\WorkSpace\markdown\書\image\image-20220604102301486.png)]
在右側對象浏覽器中選中label,之後在屬性編輯器中找到font屬性,選擇合適的字體(咳咳,商用注意小心字體侵權~),設置字體大小後記得調整Label大小。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-KAt4FsUG-1655217489239)(D:\WorkSpace\markdown\書\image\image-20220604102742568.png)]
可以商用的字體(口水話安排上:搜索結果來自互聯網,“五維星空”不對該結果的准確性負責~):
思源字體,可以免費商用的有:思源黑體,思源宋體,思源柔黑體。
方正字體,方正類字體可以免費商用的有:方正仿宋(簡,繁),方正黑體(簡,繁),方正楷體( 簡繁),方正書宋(簡,繁)。
…
額,忘了調整窗體大小,補上補上~
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-oLisKWoZ-1655217489240)(D:\WorkSpace\markdown\書\image\image-20220604103331425.png)]
調整Label大小
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-IIZ9KZQR-1655217489240)(D:\WorkSpace\markdown\書\image\image-20220604103717693.png)]
Ctrl+S
保存生成helloWorld.ui
文件即可。
在helloWorld.ui
文件目錄下打開cmd,輸入pyuic5 -o ui_HelloWorld.py helloWorld.ui
回車後生成python
文件。
pyuic5是PyQt5的工具軟件,在1.2小節安裝PyQt5的時候它已經安裝在
D:\Software\Python310\Scripts
路徑下(注意這是我本地的路徑,你的路徑應該是你的Python安裝位置。)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-D5sJ9r4Y-1655217489241)(D:\WorkSpace\markdown\書\image\image-20220604105000176.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-OrtZ4Slc-1655217489241)(D:\WorkSpace\markdown\書\image\image-20220604105056282.png)]
常見問題:
pyuic5
報命令不存在?
小老弟,是不是忘了加環境變量?添加之後記得重啟cmd
窗口。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-TBGFwt20-1655217489242)(D:\WorkSpace\markdown\書\image\image-20220604105612257.png)]
在2.1節我們使用QtDesigner生成了一個HelloWorld程序並將它轉換成了python代碼,本節我們來學習如何使用這份代碼。是不是有小伙伴已經運行代碼了發現無事發生?不要慌,我們接著往下看。我們先簡單了解一下這份文件的內容。
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'helloWorld.ui'
#
# Created by: PyQt5 UI code generator 5.15.6
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
'''注意,此處繼承的是object對象而不是QWidget對象'''
def setupUi(self, Form):
'''設置ui的函數,Form為程序最外層的組件容器對象'''
Form.setObjectName("Form") # 設置Form對象名稱
Form.resize(800, 200) # 設置大小
self.label = QtWidgets.QLabel(Form) # 在Form上定義一個Label
self.label.setGeometry(QtCore.QRect(250, 100, 420, 35)) # 定義Label位置
font = QtGui.QFont() # 定義字體
font.setFamily("楷體")
font.setPointSize(26)
font.setBold(True)
font.setWeight(75)
self.label.setFont(font) # 設置Label字體
self.label.setTextFormat(QtCore.Qt.AutoText) # 格式化處理
self.label.setObjectName("label") # 設置Label對象名稱
self.retranslateUi(Form) # 自定義方法
QtCore.QMetaObject.connectSlotsByName(Form) # 通過名稱關聯信號與插槽
def retranslateUi(self, Form):
'''設置Form的UI屬性'''
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "HelloWorld"))
self.label.setText(_translate("Form", "HelloWorld! By 五維星空~"))
怎麼樣?是不是跟咱們手寫的代碼很類似,裡面關於信號與插槽部分後面章節會講,大家只需要大致了解這份文件的風格即可(QtDesigner會有一個繼承object的類進行了ui的一些設置)。
常見的有三種方式使用這份代碼文件。
方式一:直接法(不推薦)
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from ui_HelloWorld import Ui_Form
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
container = QtWidgets.QWidget()
form = Ui_Form()
form.setupUi(container) # 將最外層組件容器對象傳入
container.show()
sys.exit(app.exec_())
缺點:耦合性太高。
方式2:多繼承(不推薦)
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from ui_HelloWorld import Ui_Form
class MyWidget(QWidget, Ui_Form):
"""多繼承"""
def __init__(self):
# 在多繼承時,super()的得到的是第一個基類,在此處就是QWidget。
super().__init__() # 調用父類構造函數,創建窗體。
self.labTip = "多繼承" # 新定義一個變量
self.setupUi(self) # 將當前類(QWidget的子類)傳入
self.label.setText(self.labTip) # 設置label內容
if __name__ == '__main__':
app = QApplication(sys.argv)
container = MyWidget()
container.show()
sys.exit(app.exec_())
缺點:MyWidget自己的屬性和Ui_Form的屬性混在一起了,不易區分。
方式3:單繼承(推薦)
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from ui_HelloWorld import Ui_Form
class MyWidget(QWidget):
"""單繼承"""
def __init__(self, parent=None):
super().__init__(parent) # 調用父類構造函數,創建窗體
self.__ui = Ui_Form() # 創建ui對象
self.__ui.setupUi(self) # 設置父窗體
self.labTip = "單繼承" # 自定義屬性
self.__ui.label.setText(self.labTip) # 設置ui內的屬性
if __name__ == '__main__':
app = QApplication(sys.argv)
container = MyWidget()
container.show()
sys.exit(app.exec_())
優點:MyWidget自己的屬性和Ui_Form的屬性易區分。
字體顯示有問題的小伙伴,請將ui轉的python文件中的
font.setPointSize(26)
改為font.setPixelSize(26)
。QtDesigner中沒有setPixelSize屬性,應該是QtDesigner和python版本不一致問題導致的吧,具體原因沒有深究,有興趣的小伙伴可以評論區討論哦。
我是五維星空,一名Java全棧開發者,熱愛技術,感謝各位大大的點贊、收藏和評論,我們下期再見!
微信搜索“五維星空”關注我吧~
by 五維星空-分享前後端技術