import sys
from PyQt5.Qt import *
app = QApplication(sys.argv)
window = QWidget()
window.show()
sys.exit(app.exec_())
# 运行以上代码将展示如下界面
# 获得父类链条
mros = QWidget.mro()
for o in mros:
print(o)
#
#
#
#
#
#
# 主要包含了我们常用的一些类,汇总到了一块
from PyQt5.Qt import *
import sys
# 创建一个应用程序对象
app = QApplication(sys.argv)
# 3、控件的操作
# 3.1、创建控件
window = QWidget() # 创建一个主程序框
# 3.2、设置控件
window.setWindowTitle('')
window.resize(500, 500)
# 3.3、展示控件
window.show()
# 4、应用程序的执行、进入消息循环。使整个程序进入无限循环
sys.exit(app.exec_())
顶层窗口的坐标原点是电脑屏幕的左上角,子控件的原点为父控件的左上角,同时都以向下和向上为y轴和x轴的正方向;
window = QWidget()
# 获取控件相对于原点x向的位移
window.x()
# 获取控件相对于原点y方向的位移
window.y()
# 同时获取控件相对于原点的x和y值
window.pos()
# 获取控件的宽
window.width()
# 获取控件的高
window.height()
# 同时获取控件的宽和高
window.size()
# 同时获取控件的位置和尺寸
window.geometry()
# 获取宽和高,并默认控件位置为原点
window.rect()
window = QWidget()
# 设置控件的位置
window.move(x, y)
# 设置控件的大小
window.resize(w, h)
# 同时设置控件的位置以及大小
window.setGeometry(x, y, w, h)
# 使控件根据内容自适应大小
window.adjustSize()
# 设置固定尺寸
window.setFixedSize()
设置了最大和最小尺寸之后,控件大小的调整只能在设定的区间内改变,同样也分为获取和设置;
获取最大和最小尺寸:
window = QWidget()
# 最小尺寸的宽度
window.minimumWidth()
# 最小尺寸的高度
window.minimumHeight()
# 同时获取最小尺寸
window.minimumSize()
# 最大尺寸的宽度
window.maximumWidth()
# 最大尺寸的高度
window.maximumHeight()
# 最大尺寸
window.maximumSize()
window = QWidget()
# 设置最大宽度
window.setMaximumWidth()
# 设置最大高度
window.setMaximumHeight()
# 设置最大尺寸
window.setMaximumSize()
# 设置最小宽度
window.setMinimumWidth()
# 设置最小高度
window.setMinimumHeight()
# 设置最小尺寸
window.setMinimumSize()
了解这部分的内容之前首先我们要了解的是,什么是内容区域。
# 设置内容边距
setContentsMargins(左, 上, 右, 下)
# 获取内容边距
getContentsMargins() # return:(左, 上, 右, 下)
# 获取内容区域
contentsRect()
应用场景: 调整控件内容边距, 使得显示更好看
window = QWidget()
window.resize(500, 500)
lab = QLabel(window)
# 设置文本框内容
lab.setText('文本框')
# 设置文本框大小
lab.resize(300, 300)
# 设置文本框背景颜色
lab.setStyleSheet("background-color:red;")
# 获得内容区域位置
print(lab.getContentsMargins()) # return:(左, 上, 右, 下)
# 上面的这些设置生成的效果如下
# 默认下’文本框‘内容显示的位置是水平靠,竖直居中的
# 设置内容区域
lab.setContentsMargins(100, 0, 0, 0)
# 设置内容区域
lab.setContentsMargins(0, 100, 0, 0)
# 设置鼠标形状的API为:
setCursor(QCursor) # 括号内枚举值为QCursor对象
# 修改鼠标形状示例
window = QWidget()
# 设置鼠标形状
window.setCursor(Qt.WaitCursor)
# 当鼠标移动至控件内部的时候鼠标形状将发生变化
实现自定义鼠标形状,需要创建QCursor对象
# 创建QCursor对象
QCursor()
# 创建一个QPixmap对象
QPixmap()
pos()
setPos(x, y)
# 设置鼠标形状可以使用枚举值,也可以自定义
window = QWidget()
# 创建QPixmap对象,热点值默认为中点位置
pixmap = QPixmap("图片路径", 热点值1, 热点值2)
# 设置图片大小
pixmap = pixmap.scaled(w, h) # 缩放是一个返回值,并不会改变原来图片的大小
# 创建QCursor对象
cursor = QCursor(pixmap)
window.setCursor(cursor)
所谓的重置鼠标形状,顾名思义就是在设置了鼠标形状之后想要恢复原鼠标形状的操作;
# 重置鼠标形状
window.unsetCursor()
通过获取鼠标,可以间接的获取鼠标的图片、鼠标的位置等信息;详细方法可以查看QCursor类的内容;
window = QWidget()
# 获取鼠标
cursor = window.cursor()
# 获取鼠标位置,相对于电脑屏幕
print(cursor.pos()) # return:PyQt5.QtCore.QPoint(577, 789),获得的是鼠标相对主屏幕的位置
# 设置鼠标位置
cursor.setPos()
# 获取鼠标图片
cursor.pixmap()
所谓的鼠标跟踪,其实就是设置检测鼠标移动事件的条件。如果没有设置鼠标跟踪,鼠标移动时,必须处于按下状态,才会触发mouseMoveEvent事件。但在设置鼠标追踪之后,鼠标移动时,不处于按下状态,也会触发mouseMoveEvent事件。
首先尝试当不设置鼠标追踪时,监听鼠标事件的情况:
# 为了看到事件触发的效果,重写QWidget类中的事件方法
# 重写类时间方法的意义在于,将重写的方法取代原有方法,不在事件发射是和receiver一起传递给QApplication
class NewQWidget(QWidget):
def mouseMoveEvent(self, evt)
print("鼠标移动了")
# 创建一个控件对象
window = NewQWidget()
window.show()
# 运行该代码需要触发mouseMoveEvent需要鼠标点下
再来看看设置了鼠标跟踪之后的情况:
# 为了看到事件触发的效果,重写QWidget类中的事件方法
class NewQWidget(QWidget):
def mouseMoveEvent(self, evt):
print("鼠标移动了")
# 创建一个控件对象
window = NewQWidget()
# 设置鼠标跟踪
window.setMouseTracking(True)
window.show()
# 运行该代码需要触发mouseMoveEvent不需要鼠标点下
# 为了看到事件触发的效果,重写QWidget类中的事件方法
class NewQWidget(QWidget):
def showEvent(self, QShowEvent):
print("窗口被展示了")
def closeEvent(self, QCloseEvent):
print("窗口被关闭了")
# 创建一个控件对象
# 由于重写了事件方法,当窗口被创建和关闭时会触发相关的打印操作
window = NewQWidget()
window.show()
# 为了看到事件触发的效果,重写QWidget类中的事件方法
class NewQWidget(QWidget):
def moveEvent(self, QMoveEvent):
print("窗口被移动了")
# 创建一个控件对象
# 由于重写了事件方法,当窗口被移动时会触发相关的打印操作
window = NewQWidget()
window.show()
# 为了看到事件触发的效果,重写QWidget类中的事件方法
class NewQWidget(QWidget):
def resizeEvent(self, QResizeEvent):
print("窗口大小改变了")
# 创建一个控件对象
# 由于重写了事件方法,当窗口大小被时会触发相关的打印操作
window = NewQWidget()
window.show()
# 为了看到事件触发的效果,重写QWidget类中的事件方法
class NewQWidget(QWidget):
def enterEvent(self, QEvent):
print("鼠标进入了")
def leaveEvent(self, QEvent):
print("鼠标离开了")
def mousePressEvent(self, QMouseEvent):
# 注意:鼠标的按下有左右之分
print("鼠标被按下了")
def mouseReleaseEvent(self, QMouseEvent):
print("鼠标被释放了")
def mouseDoubleClickEvent(self, QMouseEvent):
print("双击了鼠标")
def mouseMoveEvent(self, QMouseEvent):
print("鼠标移动了")
# 在上面介绍的事件中,应该注意的是最后一个,为鼠标追踪事件,可以查看上一小节“鼠标事件”
# 创建一个控件对象
# 由于重写了事件方法,当窗口大小被时会触发相关的打印操作
window = NewQWidget()
window.show()
class NewQWidget(QWidget):
def keyPressEvent(self, QKeyEvent):
print("键盘上的某个键被按下了")
def keyReleaseEvent(self, QKeyEvent):
print("键盘上的某个键被释放了")
# 创建一个控件对象
window = NewQWidget()
window.show()
键盘事件还有一个非常重要的知识点,就是获取键盘按下的键位:
class NewQWidget(QWidget):
def keyPressEvent(self, QKeyEvent):
# 键分为修饰键和普通键,两种键的监听方式是不同的
# 修饰键:ctrl、shift等键
# 普通键:abc...123...
# 当我们不知道某一个键属于哪一个键类型,可以使用下面的判定方法
if QKeyEvent.key() == Qt.Key_Tab # 普通键
print("用户按下了Tab")
elif QKeyEvent.modifiers() == Qt.ControlModifier: # 修饰键
print("用户按下了ctrl")
elif QKeyEvent.modifiers() == Qt.ControlModifier | Qt.ShiftModifier: # 修饰键组合
print("用户按下了ctrl+shift")
else:
print("++++++")
window = NewQWidget()
window.show()
以下事件由于不长使用,故这里只给出其API,使用方法和上述操作类似
# 获取焦点时使用
focusInEvent(QFocusEvent)
# 失去焦点时使用
focusOutEvent(QFocusEvent)
# 拖拽进入控件时调用
dragEnterEvent(QDragEnterEvent)
# 拖拽离开控件时调用
dragLeaveEvent(QDragLeaveEvent)
# 拖拽在控件内移动时调用
dragMoveEvent(QDragMoveEvent)
# 拖拽放下时调用
dropEvent(QDropEvent)
# 显示控件, 更新控件时调用
paintEvent(QPaintEvent)
# 窗体改变, 字体改变时调用
changeEvent(QEvent)
# 访问右键菜单时调用
contextMenuEvent(QContextMenuEvent)
# 输入法改变时调用
inputMethodEvent(QInputMethodEvent)
事件转发机制指的是,如上面所展示的截面中,如果我们点击了窗口中的文本框,但是我们并没有对该点击事件进行监听时,该事件会沿着父对象由下至上的传递,及向上分发事件消息;
window = QWidegt()
window.resize(500, 500)
lab1 = QLabel(window)
lab2 = QLabel(window)
lab3 = QLabel(window)
lab1.setText("标签1")
lab2.setText("标签2")
lab3.setText("标签3")
lab1.move(0, 0)
lab2.move(0, 100)
lab3.move(0, 200)
# 获取在指定坐标的控件
childAt(0, 100) # 返回lab2对象
childAt(0, 300) # 返回None
# 获取指定控件的父控件
lab1.parentWidget() # 返回QWidegt对象
# 所有子控件组成的边界矩形
window.childrenRect() # 返回矩形两角点的元组
层级控制的作用是调整空间的Z轴顺序,程序默认的层级顺序是按创建顺序排列;
# 将控件降低到最底层
lower()
# 将控件提升到最上层
raise_()
# 让a放在b下面
a.stackUnder(b)
设置的是窗口左上角和任务栏的图片
window = QWidget()
# 设置对象图标
icon = QIcon("图标图片路径")
window.setWindowIcon(icon)
# 获得对象图标
window.windowIcon()
window = QWidget()
# 设置标题文字
window.setWindowTitle("hello pyqt")
# 获取标题文字
window.windowTitle()
window = QWidget()
# 设置窗口透明图,float是一个0-1的浮点数
window.setWindowOpacity(float)
# 获取不透明度
window.windowOpacity()
窗口的状态主要包括:无状态、最小化、最大化、全屏、活动窗口五种;设置的API为setWindowState(state),需要调整窗口状态只是改变state的枚举值;
window = QWidget()
# 无状态,这是默认的窗口状态
window.setWindowState(Qt.WindowNoState)
# 最小化
window.setWindowState(Qt.WindowMinimized)
# 最大化
window.setWindowState(Qt.WindowMaximized)
# 全屏,全屏后需在进程中退出
window.setWindowState(Qt.WindowFullScreen)
# 活动窗口
window.setWindowState(Qt.WindowFullScreen)
# 获得当前窗口状态
window.windowState()
设置窗口的大小的方法有以下几种:
# 全屏显示
showFullScreen()
# 最大化
showMaximized()
# 最小化
showMinimized()
# 正常
showNormal()
同时在设置窗口状体之前我们可能需要做的是,获取当前的窗口状态,并通过当前窗口状态的作出相关的设置操作,获取状态的方式有以下几种
# 是否是最小化窗口
isMinimized()
# 是否是最大化窗口
isMaximized()
# 是否全屏
isFullScreen()
通过以上方法可以重新设置窗口最大化和最小化的操作方法
窗口标识即设置作为顶层空间的窗口的样式,API为:
window.setWindowFlags(Qt.WindowStaysOnTopHint)
枚举值Qt.WindowStaysOnTopHint分为窗口样式和顶层窗口外观标识,下面分别介绍这两种窗口标识相关的枚举值;
窗口样式
# 默认窗口样式
Qt.Widget
# 有窗口边框和标题的样式
Qt.Window
# 对话框窗口样式
Qt.Dialog
# 窗口或部件Macintosh表单
Qt.Sheet
# 窗口或部件Macintosh抽屉
Qt.Drawer
# 弹出式顶层窗口
Qt.Popup
# 是一个工具窗口
Qt.Tool
# 提示窗口,没有标题栏和窗口边框
Qt.ToolTip
# 是一个欢迎窗口,是QSplashScreen构造函数的默认值
Qt.SplashScreen
# 是一个子窗口
Qt.SubWindow
顶层窗口外观标识
# 窗口无法调整大小
Qt.MSWindowsFixedSizeDialogHint
# 窗口无边框
Qt.FramelessWindowHint
# 有边框但无标题栏和按钮,不能移动和拖动
Qt.CustomizeWindowHint
# 添加标题栏和一个关闭按钮
Qt.WindowTitleHint
# 添加系统目录和一个关闭按钮
Qt.WindowSystemMenuHint
# 激活最大化和关闭按钮,禁止最小化按钮
Qt.WindowMaximizeButtonHint
# 激活最小化和关闭按钮,禁止最大化按钮
Qt.WindowMinimizeButtonHint
# 激活最小化,最大化和关闭按钮
Qt.WindowMinMaxButtonsHint
# 添加一个关闭按钮
Qt.WindowCloseButtonHint
# 添加问号和关闭按钮,同对话框
Qt.WindowContextHelpButtonHint
# 窗口始终处于顶层位置
Qt.WindowStaysOnTopHint
# 窗口始终处于底层位置
Qt.WindowStaysOnBottomHint
获取窗口标识样式
windowFlags()
# 设置控件是否禁用
setEnabled(bool)
# 示例代码
bnt1 = QPushButton(win
bnt1.setText("按钮1")
bnt2 = QPushButton(win
bnt2.setText("按钮2")
bnt2.move(0, 100)
bnt1.setEnabled(True)
bnt2.setEnabled(False)
# 获得控件的是否为禁用状态
isEnabled()
# 是否显示/隐藏
setVisible(bool)
# 展示控件
show()
# 隐藏控件
hide()
# 判定控件是否隐藏
isHidden()
# 获取控件最终状态是否可见
isVisible()
# 设置是否编辑,包括设置窗口标题等等
setWindowModified(bool)
# 窗口是否是被编辑状态
isWindowModified()
# 是否为活跃窗口
isActiveWindow()
# 关闭
close()
信息提示包括状态提示、工具提示、点击提示三种。
# 状态提示
setStatusTip(str)
statusTip()
# 工具提示
setToolTip(str)
toolTip()
# 这是啥提示
setWhatsThis(str)
whatsThis()
状态提示:当鼠标停在控件上时,提示显示在展开状态栏;
# 使用QMainWindow创建窗口
# QMainWindow创建的窗口,包含标题栏、操作区、状态栏
window = QMainwindow()
window.resize(500, 500)
# 由于在QMainWindow中创建的相关空间时懒加载的
# 懒加载:是指用到时,才会创建
# 设置状态栏
window.statusBar()
bnt = QPushButton(window)
bnt.setStatusTip("这是一个按钮")
# 获取提示文本
bnt.statusTip()
window = QWidegt()
bnt = QPushButton(window)
# 设置提示文本
bnt.setToolTip("这是一个按钮")
# 获取提示文本
bnt.toolTip()
# 设置文本显示的时间
bnt.setToolTipDuration(毫秒)
# 获取显示时间
bnt.toolTipDuration()
window = QWidegt()
window.setWindowFlags(Qt.WindowContextHelpButtonHint)
bnt = QPushButton(window)
# 设置提示文本
bnt.setWhatsThis(“这是一个按钮”)
# 获取提示文本
bnt.whatsThis()
针对单个控件的方法
# 指定控件获取焦点
setFocus()
# 设置焦点获取策略
# API
setFocusPolicy(Policy)
# Policy枚举值
Qt.TabFocus # 通过Tab键获得焦点
Qt.ClickFocus # 通过被单击获得焦点
Qt.StrongFocus # 可通过上面两种方式获得焦点
Qt.NoFocus # 不能通过上两种方式获得焦点(默认值),setFocus仍可使其获得焦点
# 示例代码
window = QWidget()
window.resize(500, 500)
# 默认情况下光标会停留在第一个文本框,同时Tab键的切换是按对象的创建先后
lt1 = QLineEdit(window)
lt1.move(0, 0)
lt2 = QLineEdit(window)
lt2.move(0, 100)
lt3 = QLineEdit(window)
lt3.move(0, 200)
# 设置控件焦点
lt3.setFocus()
当运行程序时,光标会自动停在设置了焦点事件的控件上,否则会停留在第一个创建的控件上;
# 窗口标题改变发射信号
windowTitleChanged(QString)
# 窗口图标改变发射信号
windowIconChanged(QIcon)
# 自定义上下文菜单请求信号
customContextMenuRequested(QPoint)