PyQt是Python对Qt框架的绑定,允许开发者使用Python语言开发跨平台的GUI应用程序。Qt本身是一个用C++编写的框架,而PyQt通过SIP工具将Qt的C++类库转换为Python可调用的形式。PyQt的核心优势在于:
本系列笔记默认使用PyQt5,因为其文档和社区支持较为成熟。
通过pip
安装PyQt5:
pip install PyQt5
安装完成后,可以通过以下命令验证:
import PyQt5
print(PyQt5.__version__)
import sys
from PyQt5.QtWidgets import QApplication, QLabel
app = QApplication(sys.argv)
label = QLabel("Hello, PyQt!")
label.show()
sys.exit(app.exec_())
代码解析:
QApplication
:管理应用程序的控制流和主设置。QLabel
:显示文本或图像的控件。app.exec_()
:进入主事件循环,等待用户交互。运行效果:屏幕中央显示一个标签,内容为"Hello, PyQt!"。
信号(Signal)与槽(Slot)是Qt框架的核心通信机制,用于对象之间的事件传递。
示例:
from PyQt5.QtWidgets import QApplication, QPushButton
def on_button_clicked():
print("Button clicked!")
app = QApplication([])
button = QPushButton("Click Me")
button.clicked.connect(on_button_clicked) # 连接信号与槽
button.show()
app.exec_()
输出:点击按钮后,控制台输出"Button clicked!"。
Qt应用程序依赖于事件循环(Event Loop)处理用户输入、窗口重绘等任务。QApplication.exec_()
启动事件循环,直到调用quit()
或窗口关闭。
PyQt将功能划分为多个模块,以下是常用模块:
模块 | 功能 |
---|---|
QtCore |
核心功能,如信号/槽、文件操作、时间处理等 |
QtGui |
与图形相关功能,如绘图、字体、颜色等 |
QtWidgets |
GUI控件(按钮、文本框等) |
QtNetwork |
网络通信功能 |
QtSql |
数据库操作 |
QtMultimedia |
音频、视频处理 |
示例:使用QtCore
模块创建定时器
from PyQt5.QtCore import QTimer
import sys
def timer_callback():
print("Timer triggered!")
app = QApplication(sys.argv)
timer = QTimer()
timer.timeout.connect(timer_callback)
timer.start(1000) # 每1000毫秒触发一次
app.exec_()
Qt Designer是Qt官方提供的可视化界面设计工具,支持拖拽式布局。生成的.ui
文件可通过pyuic5
转换为Python代码。
pyuic5 -x main_window.ui -o main_window.py
PyQt项目通常使用.pro
文件(Qt项目文件)管理依赖关系。例如:
QT += widgets
TARGET = MyPyQtApp
TEMPLATE = app
SOURCES += main.cpp \
mainwindow.cpp
PyQt提供了多种布局管理器,用于自动排列控件:
QHBoxLayout
:水平布局QVBoxLayout
:垂直布局QGridLayout
:网格布局示例:水平布局
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout
app = QApplication([])
window = QWidget()
layout = QHBoxLayout()
btn1 = QPushButton("Left")
btn2 = QPushButton("Right")
layout.addWidget(btn1)
layout.addWidget(btn2)
window.setLayout(layout)
window.show()
app.exec_()
使用QSpacerItem
或addStretch()
方法控制控件间距:
layout.addStretch() # 添加弹性空间
QPushButton
:普通按钮QRadioButton
:单选按钮QCheckBox
:复选框示例:单选按钮组
from PyQt5.QtWidgets import QButtonGroup
radio1 = QRadioButton("Option 1")
radio2 = QRadioButton("Option 2")
group = QButtonGroup()
group.addButton(radio1)
group.addButton(radio2)
QLineEdit
:单行文本输入QTextEdit
:多行文本输入QComboBox
:下拉列表示例:获取输入文本
line_edit = QLineEdit()
text = line_edit.text()
QGroupBox
:带标题的分组框QTabWidget
:选项卡控件QScrollArea
:滚动区域示例:选项卡控件
from PyQt5.QtWidgets import QTabWidget
tab_widget = QTabWidget()
tab_widget.addTab(QWidget(), "Tab 1")
tab_widget.addTab(QWidget(), "Tab 2")
通过pyqtSignal
定义自定义信号:
from PyQt5.QtCore import pyqtSignal, QObject
class Communicator(QObject):
my_signal = pyqtSignal(str)
comm = Communicator()
comm.my_signal.connect(lambda x: print(x))
comm.my_signal.emit("Hello!")
disconnect()
方法解除连接。示例:传递参数
def on_value_changed(value):
print(f"Value: {value}")
slider.valueChanged.connect(lambda: on_value_changed(slider.value()))
QMouseEvent
:鼠标事件QKeyEvent
:键盘事件QPaintEvent
:绘图事件示例:重写鼠标事件
from PyQt5.QtWidgets import QWidget
class MyWidget(QWidget):
def mousePressEvent(self, event):
print(f"Mouse pressed at {event.pos()}")
通过installEventFilter()
拦截特定对象的事件:
def eventFilter(self, obj, event):
if event.type() == QEvent.MouseButtonPress:
print("Event filtered!")
return True
return super().eventFilter(obj, event)
QPainter
用于在控件上绘制图形:
from PyQt5.QtGui import QPainter, QColor
class MyCanvas(QWidget):
def paintEvent(self, event):
painter = QPainter(self)
painter.setPen(QColor(255, 0, 0))
painter.drawLine(0, 0, 100, 100)
painter.drawText(10, 20, "Hello PyQt")
painter.drawImage(50, 50, QImage("image.png"))
通过QThread
实现多线程操作:
from PyQt5.QtCore import QThread, pyqtSignal
class Worker(QThread):
finished = pyqtSignal()
def run(self):
# 执行耗时操作
self.finished.emit()
worker = Worker()
worker.finished.connect(app.quit)
worker.start()
避免在主线程中直接操作UI,使用信号/槽跨线程通信。
通过QNetworkAccessManager
实现HTTP请求:
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest
manager = QNetworkAccessManager()
reply = manager.get(QNetworkRequest(QUrl("https://example.com")))
reply.finished.connect(lambda: print(reply.readAll().data()))
使用QSqlDatabase
连接数据库:
from PyQt5.QtSql import QSqlDatabase, QSqlQuery
db = QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("test.db")
query = QSqlQuery()
query.exec_("CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, name TEXT)")
通过setStyleSheet()
设置控件样式:
button.setStyleSheet("background-color: red; color: white;")
样式表支持选择器和嵌套规则:
QPushButton {
font-size: 14px;
}
QPushButton#okButton {
background-color: green;
}
使用tr()
标记需要翻译的字符串:
self.setWindowTitle(self.tr("Application"))
通过工具生成.ts
和.qm
文件,实现多语言支持。
print()
或日志模块输出调试信息。qDebug()
打印Qt内部日志。QTimer
分批处理数据。本节课主要介绍了PyQt的基础知识,包括:
下一节课将深入讲解PyQt的模型-视图架构,包括QTableView
、QListView
等组件的使用,以及如何通过模型管理数据。请持续关注后续内容!