模块名 | 作用 |
---|---|
QtWidgets | 包含一整套UI元素控件,用于建立符合系统风格的界面(例如窗口最小化最大化关闭按钮根据在window还是mac的窗口 自适应地在右上角或左上角) |
QtGui | 包含多种基本图形功能的类(字体、图形、图表、颜色等) |
QtCore | 包含了包的核心的非GUI功能(时间、目录、数据类型、文本流、连接、线程进程等) |
QtWebKit、QtTest | |
QtMultimedia、QtMultimediaWidgets | 多媒体 |
Qt | 将基本全部模块中的类综合到一个单一的模块中 |
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv) # 将命令行传进来的参数传递给app
print(app.arguments()) # 上一行传递的sys.argv可以通过app.arguments()获得
# 打印:['C:\\Users\\ZHUIAO\\PycharmProjects\\pythonProject\\main.py']
print(qApp.arguments()) # 全局的应用程序对象,打印内容和上面 app.arguments()一样
window = QWidget()
window.setWindowTitle("这是标题") # 标题
window.resize(300, 100) # 窗口宽300,高100
window.move(400, 200) # 窗口距离左侧400,距离上方200
label = QLabel(window)
label.setText("这是label")
label.move(120, 40)
window.show() # 显示窗口
# sys.exit(0)表示正常退出,若程序运行错误,app.exec_()返回非0
# app.exec_()表示让整个程序进入主循环,不要停止
sys.exit(app.exec_())
如果没有指定父控件(父控件如下面的QLabel(window)),那么它本身就作为了顶层控件(窗口)
系统会自动给窗口添加一些装饰(如标题栏,最大化最小化)
对比上面代码和下面代码,label没有父控件,可以label.show()显示为第二个窗口,而且也有自己的标题栏、最大化最小化按关闭钮
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv) # 将命令行传进来的参数传递给app
window = QWidget(); window.setWindowTitle("这是标题"); window.resize(300, 100); window.move(400, 200)
window.show()
label = QLabel()
label.setText("这是label")
label.move(120, 40)
label.show() # 显示窗口
# sys.exit(0)表示正常退出,若程序运行错误,app.exec_()返回非0
# app.exec_()表示让整个程序进入主循环,不要停止
sys.exit(app.exec_())
from PyQt5.Qt import *
import sys
class Window(QWidget):
def __init__(self):
super().__init__() # 在初始化QWidget时会进行一些操作,所以在继承QWidget时必须先执行父类初始化函数
self.setWindowTitle("这是窗口标题")
self.resize(300, 80)
self.setup_ui()
def setup_ui(self):
label = QLabel(self)
label.setText("这是标签")
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
名称 | 说明 |
---|---|
QPushButton | 普通按钮 |
QCommandLinkButton | 可以显示详情 |
QRadioButton | 单选按钮(选单个) |
QCheckBox | 复选按钮(同时选多个) |
名称 | 说明 |
---|---|
QLineEdit | 单行输入 |
QTextEdit | 多行输入(输入可以是超链接、图片等富文本) |
QPlainTextEdit | 普通的多行文本,将超链接、图片等富文本失效 |
QKeySequenceEdit | 采集键盘输入,例如:Ctrl+A、Ctrl+C |
名称 | 说明 |
---|---|
QDateTimeEdit | 采集时间,可以采集单独的日期和时间: QDateEdit QTimeEdit |
QSpinBOX | 采集一个整数 |
QDoubleSpinBox | 采集浮点数 |
下拉选项框:QComboBox、QFontComboBox(下拉选择字体)
滑块(QAbstractSlider):
名称 | 说明 |
---|---|
QDial | 旋钮 |
QSlider | 滑块 |
QScrollBar | 滚动条 |
橡皮筋选中:QRubberBand(可以用来选中控件)
对话框(QDialog):
名称 | 说明 |
---|---|
QColorDialog | 选择颜色 |
QFileDialog | 选择文件 |
QFondDialog | 选择字体 |
QInputDialog | 输入对话框 |
名称 | 说明 |
---|---|
QLabel | 展示标签,可以是普通文本、数字、富文本、图片、QLabel-动画(如gif) |
QLCDNumber | LCD数字 |
QProgressBar | 进度条 |
对话框(QDialog) | QMessageBox:展示警告、提示、错误 QErrorMessage:错误对话框 QProgressDialog:进度对话框 |
名称 | 说明 |
---|---|
QToolBox | 一般容器 |
QDialogButtonBox | 可以分多个组 |
QGroupBox | 可以分多个组,每个组边框,有对应的标题 |
QMdiSubWindow | QMdiArea和QMdiSubWindow,可以在控件内创建控件,子控件有最大化最小化关闭按钮 |
名称 | 说明 | 相关控件 |
---|---|---|
QMainWindow | 有菜单栏、工具栏、Dock Window、状态栏等 | 菜单栏QMenuBar(包含控件QMenu)、工具栏QToolBar(包含控件QToolButton)、状态栏QStatusBar |
QTabWidget | 标签控件 | 包含控件QTabBar |
QStackedWidget | 栈结构类型的控件,可以包含多个界面重复调用 | |
QSplitter | 可以将一个界面分割为多个界面 | |
QDockWidget | 可以将界面悬浮或停靠在父界面中 |
名称 | 说明 |
---|---|
QTextBrowser | 文本浏览器,可以滚动显示大篇幅的文本(和浏览.txt差不多) |
QScrollArea | 可以滚动浏览尺寸很大的图片,水平滚动和竖直滚动 |
QAbstractltemView | QColumnView分成多列浏览 QListView多行 QListView(包含QListWidget选择多列的元素、QUndoView撤销操作) QTableView表格控件(包含控件QTableWidget) QTreeWidget树形结构展开 |
QMdiarea | 可以将多个子控件放里面?? |
QGraphicsView | 画图 |
名称 | 说明 |
---|---|
QFocusFrame | 获取焦点,得到焦点的边框可以有不一样的样式显示 |
QSizeGrip | 窗口右下角显示可以拖拉缩放窗口的小三角 |
QDesktopWidget | 获取桌面信息,如尺寸、个数 |
名称 | 说明 | 相关控件 |
---|---|---|
向导、打印(QDialog) | QWizard,安装软件的向导 | QWizardPage,软件安装向导中单独的一页 |
QAbstractPrintDialog,打印控件 | QPrintDialog | |
QPrintPreviewDialog,打印前的预览界面 | QPrintPreviewWidget | |
QPageSetupDialog,选择打印纸张大小方向等 | ||
欢迎界面QSplashScreen | QSplashScreen,打开软件加载时间长,可以先显示欢迎界面,例如打开Photoshop会先显示“PS 正在加载...” | |
功能性控件 | QVideoWidget,在这个控件中播放视频 | QCameraViewfinder(相机) |
QWebEngineView,控件中打开打开网页 |
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv) # 将命令行传进来的参数传递给app
window1 = QWidget(); window1.setWindowTitle("窗口1"); window1.resize(250, 50); window1.move(400, 200)
window1.show()
window2 = QWidget(); window2.setWindowTitle("窗口2"); window2.resize(250, 50); window2.move(650, 200)
window2.show()
sys.exit(app.exec_())
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv) # 将命令行传进来的参数传递给app
window = QWidget(); window.setWindowTitle("这是标题"); window.resize(300, 150); window.move(400, 200)
obj0 = QObject()
obj1 = QObject()
# 监听obj1被释放
obj1.destroyed.connect(lambda: print("obj1被释放了"))
obj1.setParent(obj0)
del obj0 # 释放obj0对象时,自动释放obj1(实际上Python会自动回收未被引用的对象obj0)
window.show(); sys.exit(app.exec_())
# 输出
obj1被释放了
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv) # 将命令行传进来的参数传递给app
window1 = QWidget(); window1.setWindowTitle("窗口1"); window1.resize(200, 200)
window1.setStyleSheet("background-color: red;")
window1.show()
window2 = QWidget(); window2.resize(400, 100)
window2.setStyleSheet("background-color: green;")
window2.setParent(window1)
window2.show()
sys.exit(app.exec_())
mros = QObject.mro()
for mro in mros:
print(mro)
# 输出:可以查看继承链
<class 'PyQt5.QtCore.QObject'>
<class 'sip.wrapper'>
<class 'sip.simplewrapper'>
<class 'object'>
函数 | 说明 |
---|---|
setObjectName(“唯一名称”) | 给Qt对象设置一个名称,而且一般是唯一的,当做对象的ID使用 |
objectName | 获取Qt对象的名称 |
setProperty(“属性名称”, 值) | 给一个Qt对象动态的添加一个属性与值 |
property(“属性名称”) | 获取对象的属性值 |
dynamicPropertyNames() | 获取对象中所有通过setProperty()设置的属性名称 |
obj = QObject()
obj.setObjectName("对象名称") # 设置 对象obj 的名称
print(obj.objectName()) # 获取 对象obj 的名称,打印:对象名称
obj.setProperty("property_1", "value_1") # 设置obj的属性与对应值(就是 obj对象 设置一组键值对)
obj.setProperty("property_2", "value_2")
print(obj.property("property_1")) # 获取对应属性的值,打印:value_1
# 获取 所有属性的值
# 打印:[PyQt5.QtCore.QByteArray(b'property_1'), PyQt5.QtCore.QByteArray(b'property_2')]
print(obj.dynamicPropertyNames())
应用场景:
用于qss的ID选择器,属性选择器,方便统一设置样式
用于装饰器的信号与槽
可以理解为css样式一样的作用,就是设置字体/按钮/标签等组件的大小颜色等样式。
例如:“font-size: 20px; color: red;”就是qss样式设置字体大小颜色。
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv) # 将命令行传进来的参数传递给app
window = QWidget(); window.setWindowTitle("这是标题"); window.resize(300, 100); window.move(400, 200)
label = QLabel(window)
label.setText("这是标签")
label.setStyleSheet("font-size: 20px; color: red;") # 字体大小20像素,颜色红色
window.show()
sys.exit(app.exec_())
创建一个QObject.txt文件,将重命名为QObject.qss,用记事本打开,写入下面内容,就可以在匹配到QLabel组件时使用该样式。
还可以添加选择器
- 例如下面选择将QLabel的字体大小设为20px红色
- 还可以添加id选择器(将特定元件的id,也就是name,设置为特定的样式)
- 也可以进一步用元件的属性值进行区分
QLabel {
font-size: 10px;
color: gray;
}
QLabel#id_1 {
font-size: 20px;
color: green;
}
QLabel#id_1[property_4="value_4"] {
font-size: 30px;
color: gray;
border: 5px solid red;
border-radius: 8px;
}
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv) # 将命令行传进来的参数传递给app
window = QWidget(); window.setWindowTitle("这是标题"); window.resize(300, 150); window.move(400, 200)
with open("QObject.qss", "r") as f:
qApp.setStyleSheet(f.read()) # 下面组件的样式都会优先在这里匹配样式
label1 = QLabel(window)
label1.setText("这是标签1")
label2 = QLabel(window)
label2.setObjectName("id_1") # 将标签的名称(id)设定为 id_1
label2.setText("这是标签2")
label2.move(30, 30) # 标签移动 30, 30
label3 = QLabel(window)
label3.setObjectName("id_1") # 将标签的名称(id)设定为 id_1
label3.setText("这是标签3")
label3.move(60, 60)
label4 = QLabel(window)
label4.setObjectName("id_1") # 将标签的名称(id)设定为 id_1
label4.setProperty("property_4", "value_4")
label4.setText("这是标签4")
label4.move(90, 90)
window.show(); sys.exit(app.exec_())
函数 | 说明 |
---|---|
setParent(parent) | 设置父对象 |
parent() | 获取父对象 |
children() | 获取所有直接子对象 |
findChild(参数1,参数2,参数3) | 返回找到的第一个子对象: 参数1:指定类型/类型元组(如QPushButton, QLalbel) 参数2:名称(可省略) 参数3:查找选项(如Qt.FindChildrenRecursively递归查找还是其他,Qt.FindDirectChildrenOnly只查找直接子对象) |
findChildren(参数1,参数2,参数3) | 返回找到的所有子对象 |
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv) # 将命令行传进来的参数传递给app
window = QWidget(); window.setWindowTitle("这是标题"); window.resize(300, 150); window.move(400, 200)
obj0 = QObject()
obj0_0 = QObject()
obj0_1 = QObject()
obj0_0_0 = QObject()
obj0_0.setParent(obj0)
obj0_1.setParent(obj0)
obj0_0_0.setParent(obj0_0)
print("获取父对象:", obj0_0.parent())
print("获取所有直属的子对象:", obj0.children())
print("找到第一个子对象:", obj0.findChild(QObject))
print("找到所有子对象,包含间接子对象:", obj0.findChildren(QObject))
window.show(); sys.exit(app.exec_())
# 输出:
获取父对象: <PyQt5.QtCore.QObject object at 0x00000226BB66AD30>
获取所有直属的子对象: [<PyQt5.QtCore.QObject object at 0x00000226BB66ADC0>, <PyQt5.QtCore.QObject object at 0x00000226BB66AE50>]
找到第一个子对象: <PyQt5.QtCore.QObject object at 0x00000226BB66ADC0>
找到所有子对象,包含间接子对象: [<PyQt5.QtCore.QObject object at 0x00000226BB66ADC0>, <PyQt5.QtCore.QObject object at 0x00000226BB66AEE0>, <PyQt5.QtCore.QObject object at 0x00000226BB66AE50>]
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv) # 将命令行传进来的参数传递给app
window = QWidget(); window.setWindowTitle("这是标题"); window.resize(300, 150); window.move(400, 200)
obj0 = QObject()
obj0_0 = QLabel()
obj0_0.setParent(obj0) # 报错:label的父容器必须能显示的容器,而QObject不是容器
window.show(); sys.exit(app.exec_())
简单理解,信号就是侦听信号,槽就是接收到信号所需要执行的操作
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv) # 将命令行传进来的参数传递给app
window = QWidget(); window.setWindowTitle("这是标题"); window.resize(300, 150); window.move(400, 200)
obj = QObject()
# 监听obj1被释放
obj.destroyed.connect(lambda: print("obj被释放了"))
del obj # 释放obj0对象时,自动释放obj1(实际上Python会自动回收未被引用的对象obj0)
window.show(); sys.exit(app.exec_())
# 输出:obj被释放了
destroyed()函数也可以传递被烧毁的对象
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv) # 将命令行传进来的参数传递给app
window = QWidget(); window.setWindowTitle("这是标题"); window.resize(300, 150); window.move(400, 200)
obj = QObject()
def destroyedObj(myQObject): # 可以接受被释放的对象
print("释放了对象:", myQObject)
obj.destroyed.connect(destroyedObj) # 监听obj1被释放
del obj # 释放obj0对象时,自动释放obj1(实际上Python会自动回收未被引用的对象obj0)
window.show(); sys.exit(app.exec_())
# 输出:
释放了对象: <PyQt5.QtCore.QObject object at 0x000002525FFBED30>