目錄
VSCode添加外部工具
QtDesigner
PyUIC
PyRCC
加載UI文件模板代碼
QMainWindow
QWidget
常用知識點
1. 修改標題圖標
2. 圖片資源管理
3. 圖片按鈕
4. 加載對話框
5. 動態加載Widget
6. 修改主題
其他注意事項
事件被多次觸發
PyQt5提供了一個可視化圖形工具Qt Designer
,文件名為designer.exe
。如果在電腦上找不到,可以用如下命令進行安裝:
pip install PyQt5-tools
?
安裝完畢后,可在如下目錄找到此工具軟件:
%LOCALAPPDATA%\Programs\Python\Python39\Lib\site-packages\qt5_applications\Qt\bin\designer.exe
注意:%LOCALAPPDATA%
通常代表C:\Users\你的用戶名\AppData\Local\
VSCode添加外部工具
QtDesigner
打開PYQT Integration
插件設置,搜索designer
,將自己本地的designer.exe
完整路徑設置進去。
?
?
注意,如果找不到
designer.exe
:
- Program路徑要根據自己安裝的PyQt5-tools路徑設置(
pip install PyQt5-tools
)- 安裝的PyQt5-tools路徑的取決于安裝Python時的路徑(
pip -V
可以看到路徑)- 如果用的是Python3.9.x,嘗試用以下路徑文件(先嘗試在Win+R中能否打開):
%LOCALAPPDATA%\Programs\Python\Python39\Lib\site-packages\qt5_applications\Qt\bin\designer.exe
- 實在找不到,建議安裝
everything.exe
,全局搜索designer.exe
位置
設置完成后,我們可以在.ui
文件右鍵進行如下操作:
?
也可以在任意目錄右鍵新建ui文件
PyUIC
打開設置,過濾pyuic,按照下圖填寫:
- Cmd:
pyuic5
- Add Options:
--import-from=ui
- Filepath:
Ui_${ui_name}.py
這個配置是為了右鍵.ui
文件時,點擊PYQT:Compile Form
時,能生成對應.py
文件
PyRCC
確保配置如下即可:
添加完成后,可在.qrc
文件右鍵點擊PYQT: Compile Resource
,即可生成對應的.py
資源文件。
?
加載UI文件模板代碼
QMainWindow
我們通過可視化工具QtDesigner
生成.ui
文件后,需要在代碼中加載并顯示。可參照PyUIC
部分教程進行轉換。
使用xxx.ui
生成xxx.py
代碼文件后,可使用如下代碼進行加載。
注意,本例的ui
相關文件都在ui
目錄下,即加載的ui
包下的ui_main_window
模塊
"""
PyQt5版GUI工具
"""
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from ui.Ui_main_window import Ui_MainWindow
import sysclass MainWindow(QMainWindow):def __init__(self):super().__init__()# 創建對象self.ui = Ui_MainWindow()# 初始化內容self.ui.setupUi(self)# 初始化uiself.init_ui()def init_ui(self):passdef main():app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())if __name__ == '__main__':main()
目錄結構如下
?
QWidget
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
# 幫我們直接運行此文件時,可以加載到上級目錄的ui包
sys.path.append("../")from ui.Ui_my_widget import Ui_MyWidgetclass MyWidget(QWidget):def __init__(self, parent=None):super().__init__(parent)self.ui = Ui_MyWidget()self.ui.setupUi(self)self.init_ui()def init_ui(self):passif __name__ == '__main__':app = QApplication(sys.argv)window = MyWidget()window.show()sys.exit(app.exec_())
QDialog
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from ui.Ui_serial_setting_dialog import Ui_SerialSettingDialog
import sysclass SerialSettingDialog(QDialog):def __init__(self, parent=None):super().__init__(parent)self.ui = Ui_SerialSettingDialog()self.ui.setupUi(self)# 可以通過此設置,固定對話框的大小self.setFixedSize(self.width(), self.height())self.initUi()self.baudrate = Nonedef initUi(self):passdef accept(self):super().accept()print("accept")# 讀取當前波特率的設置值self.baudrate = self.ui.cb_bt.currentText()def reject(self):super().reject()print("reject")if __name__ == '__main__':app = QApplication(sys.argv)dialog = SerialSettingDialog()dialog.show()sys.exit(app.exec_())
常用知識點
1. 修改標題圖標
2. 圖片資源管理
3. 圖片按鈕
background-color: transparent;
border: none;
4. 加載對話框
5. 動態加載Widget
6. 修改主題
qt-material
主題官網:GitHub - UN-GCPDS/qt-material: Material inspired stylesheet for PySide2, PySide6, PyQt5 and PyQt6
使用方式:
安裝:
pip install qt-material
代碼:
from qt_material import apply_stylesheetapp = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QMainWindow()# setup stylesheet
apply_stylesheet(app, theme='dark_teal.xml')# run
window.show()
app.exec_()
效果:
?
其他注意事項
事件被多次觸發
問題描述:
如果自己給某個按鈕或組件的信號設置槽函數,期待點擊一次只觸發一次,但是莫名被觸發了多次。
原因分析:
參考文檔介紹:QMetaObject - Qt for Python
原因很可能是因為槽函數命名問題。因為我們使用.ui
文件生成的.py
文件中,會執行一個如下的方法。幫我們根據組件的變量名綁定對應的槽函數:
QtCore.QMetaObject.connectSlotsByName(ChatRoomsWidget)
假設我們的對象有一個QPushButton
類型的子對象,對象名稱為button1
。則自動connect
且捕獲按鈕的clicked()
信號的槽是:
def on_button1_clicked():?
如果對象本身有一個通過setObjectName()
設置的對象名稱,它自己的信號也連接到它對應的槽。
解決辦法:
換一個槽函數名稱,或是按照官方規則直接聲明槽函數
?
?
?
?
?
?
?