# PyQt5界面的基本寫法和基礎的類封裝代碼
## 一、PyQt5簡介
PyQt5是Python語言的GUI編程工具包,是Qt應用程序框架的Python綁定。它由Riverbank Computing開發,允許開發者使用Python語言創建功能豐富的桌面應用程序。PyQt5提供了超過620個類和6000個函數方法,支持跨平臺開發(Windows、Linux、macOS)。
### 主要特點:
- 基于Qt的成熟框架
- 支持信號與槽機制
- 豐富的UI組件庫
- 可擴展性強
- 良好的文檔和社區支持
## 二、基本PyQt5程序結構
### 1. 最簡單的PyQt5窗口
```python
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == '__main__':
app = QApplication(sys.argv) # 創建應用對象
window = QWidget() # 創建窗口
window.resize(400, 300) # 設置窗口大小
window.setWindowTitle('第一個PyQt5程序') # 設置窗口標題
window.show() # 顯示窗口
sys.exit(app.exec_()) # 進入主循環
將窗口封裝成類可以提高代碼的可維護性和復用性:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('類封裝示例')
self.resize(400, 300)
# 創建標簽
self.label = QLabel('歡迎使用PyQt5', self)
self.label.setStyleSheet('font-size: 20px; color: blue;')
# 設置布局
layout = QVBoxLayout()
layout.addWidget(self.label)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
from PyQt5.QtWidgets import (
QPushButton, QLineEdit,
QCheckBox, QRadioButton,
QComboBox, QSpinBox
)
class ControlDemo(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('控件演示')
self.resize(500, 400)
# 按鈕
self.btn = QPushButton('點擊我', self)
self.btn.clicked.connect(self.on_click)
# 文本框
self.textbox = QLineEdit(self)
self.textbox.setPlaceholderText('輸入內容...')
# 復選框
self.checkbox = QCheckBox('同意協議', self)
# 單選按鈕
self.radio1 = QRadioButton('選項1', self)
self.radio2 = QRadioButton('選項2', self)
# 下拉框
self.combo = QComboBox(self)
self.combo.addItems(['Python', 'Java', 'C++', 'JavaScript'])
# 微調框
self.spin = QSpinBox(self)
self.spin.setRange(0, 100)
# 布局
layout = QVBoxLayout()
layout.addWidget(self.btn)
layout.addWidget(self.textbox)
layout.addWidget(self.checkbox)
layout.addWidget(self.radio1)
layout.addWidget(self.radio2)
layout.addWidget(self.combo)
layout.addWidget(self.spin)
self.setLayout(layout)
def on_click(self):
print(f'文本框內容: {self.textbox.text()}')
PyQt5使用信號(signal)和槽(slot)機制進行對象間的通信。
from PyQt5.QtCore import pyqtSlot
class SignalSlotDemo(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('信號與槽演示')
self.btn = QPushButton('點擊發送信號', self)
self.label = QLabel('等待信號...', self)
# 連接信號與槽
self.btn.clicked.connect(self.on_button_click)
layout = QVBoxLayout()
layout.addWidget(self.btn)
layout.addWidget(self.label)
self.setLayout(layout)
@pyqtSlot() # 裝飾器明確表示這是一個槽函數
def on_button_click(self):
self.label.setText('收到按鈕點擊信號!')
print('按鈕被點擊')
from PyQt5.QtCore import pyqtSignal, QObject
class MySignal(QObject):
# 定義一個信號
signal_msg = pyqtSignal(str)
class CustomSignalDemo(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('自定義信號演示')
self.sender = MySignal()
self.sender.signal_msg.connect(self.receive_msg)
self.btn = QPushButton('發送自定義信號', self)
self.btn.clicked.connect(self.send_custom_signal)
self.label = QLabel('等待自定義信號...', self)
layout = QVBoxLayout()
layout.addWidget(self.btn)
layout.addWidget(self.label)
self.setLayout(layout)
def send_custom_signal(self):
self.sender.signal_msg.emit('這是自定義消息內容')
def receive_msg(self, msg):
self.label.setText(f'收到消息: {msg}')
from PyQt5.QtWidgets import (
QWidget, QLineEdit, QPushButton,
QGridLayout, QApplication
)
import sys
class Calculator(QWidget):
def __init__(self):
super().__init__()
self.initUI()
self.setWindowTitle('簡易計算器')
self.resize(300, 400)
def initUI(self):
# 顯示框
self.display = QLineEdit('0')
self.display.setReadOnly(True)
self.display.setAlignment(Qt.AlignRight)
self.display.setStyleSheet('font-size: 24px;')
# 按鈕文本
buttons = [
'7', '8', '9', '/',
'4', '5', '6', '*',
'1', '2', '3', '-',
'C', '0', '=', '+'
]
# 創建網格布局
grid = QGridLayout()
grid.addWidget(self.display, 0, 0, 1, 4)
# 添加按鈕
positions = [(i+1, j) for i in range(4) for j in range(4)]
for position, text in zip(positions, buttons):
btn = QPushButton(text)
btn.setStyleSheet('font-size: 18px;')
btn.clicked.connect(self.on_click)
grid.addWidget(btn, *position)
self.setLayout(grid)
def on_click(self):
sender = self.sender().text()
current = self.display.text()
if sender == 'C':
self.display.setText('0')
elif sender == '=':
try:
result = eval(current)
self.display.setText(str(result))
except:
self.display.setText('錯誤')
else:
if current == '0':
self.display.setText(sender)
else:
self.display.setText(current + sender)
if __name__ == '__main__':
app = QApplication(sys.argv)
calc = Calculator()
calc.show()
sys.exit(app.exec_())
代碼組織:
命名規范:
資源管理:
性能優化:
錯誤處理:
本文介紹了PyQt5的基本程序結構、類封裝方法、常用控件與布局、信號與槽機制,并通過一個綜合案例展示了實際開發中的代碼組織方式。PyQt5作為功能強大的GUI工具包,通過良好的封裝和面向對象的設計,可以幫助開發者構建復雜的桌面應用程序。
掌握這些基礎知識后,可以進一步學習: - 多窗口應用程序開發 - 數據庫集成 - 圖表繪制(QtChart) - 自定義控件開發 - 樣式表(QSS)美化界面 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。