【GUI-pyqt5】QWidget类

1. 描述

  1. 所有可视空间的基类
  2. 是一个最简单的空白控件
  3. 控件是用户界面的最小元素
    1. 接收各种事件(鼠标、键盘)
    2. 绘制在桌面上,显示给用户看
  4. 每个控件都是矩形的,它们按z轴顺序排序
  5. 控件由其父控件和前面的控件剪切
  6. 没有父控件的控件,称之为窗口
    1. 一般会被包装一个框架(标题栏等)
    2. 可以通过某些设置更改

2. 继承

  1. QObject
  2. QPaintDevice

3. 功能

3.1 控件的创建

3.1.1 API

API功能备注
__init__(self, parent=None, flags)
创建控件时,设置父控件以及标志位
parent:父控件;flags:标志位

3.2 大小位置

3.2.1 API

3.2.1.1 获取
API功能备注
x()
相对于父控件的位置,包含窗口框架
顶层控件则相对于桌面x位置
y()
相对于父控件的y位置,包含窗口框架
顶层控件则相对于桌面y位置
pos()
x,y的组合,包含窗口框架
QPoint(x, y)
width()
控件宽度,不包含任何窗口框架
-
height()
控件高度,不包含任何窗口框架
-
size()
width和height的组合
QSize(width, height)
geometry()
用户区域相对于父控件的位置和尺寸组合
QRect(x, y, width, height)
rect()
0, 0, width, height组合
QRect(0, 0, width, height)
frameSize()
框架大小
-
frameGeometry()
框架尺寸
-

在这里插入图片描述

3.2.1.1.1 代码
from PyQt5.Qt import *import sysif __name__ == '__main__':app = QApplication(sys.argv)window = QWidget()window.setWindowTitle('位置大小')window.resize(500, 500)window.move(100, 100)# 在窗口显示前获取尺寸信息print(window.size())print(window.geometry())print(window.frameSize())print(window.frameGeometry())print("--"*20)window.show()# 在窗口显示之后获取尺寸信息print(window.size())print(window.geometry())print(window.frameSize())print(window.frameGeometry())sys.exit(app.exec_())

运行结果:
在这里插入图片描述
注意:控件显示完毕后,具体尺寸数据才会正确

3.2.1.2 设置
3.2.1.1 获取
API功能备注
move(x, y)
操控pos
包含窗口框架
resize(width, height)
操控控件宽高
不包括窗口框架
setGeometry(x_noFrame, y_noFrame, width, height)
设置用户区域位置和大小
-
adjustSize()
根据内容自适应大小
-
setFixedSize()
设置固定尺寸
-
3.2.1.2 案例

通过给定的的个数, 你负责在一个窗口内创建相应个数的子控件
要求:按照九宫格的布局进行摆放,一行放给定的列

from PyQt5.Qt import *import sysif __name__ == '__main__':app = QApplication(sys.argv)window = QWidget()window.show()window.resize(500, 500)window.move(500, 500)# 总的控件个数widget_count = 500# 每一行列的个数column_count = 5# 计算一个控件的宽度widget_width = window.width() / column_count# 总共有多少行row_count = (widget_count-1)//column_count + 1widget_height = window.height() / row_countfor i in range(0, widget_count):w = QWidget(window)w.resize(int(widget_width), int(widget_height))widget_x = i % column_count * widget_widthwidget_y = i // column_count * widget_heightw.move(int(widget_x), int(widget_y))w.setStyleSheet('background-color: red;border:1px solid yellow;')w.show()sys.exit(app.exec_())

运行结果:(500个控件,每一行放5个控件)
在这里插入图片描述

3.3 最大和最小尺寸

3.3.1 API

3.3.1.1 获取
API功能备注
minimumWidth()
最小尺寸宽度
-
minimumHeight()
最小尺寸高度
-
minimumSize()
最小尺寸
-
maximumWidth()
最大尺寸宽度
-
maximumHeight()
最大尺寸高度
-
maximumSize()
最大尺寸
-
3.3.1.2 设置
API功能备注
setMinimumWidth()
设置最小尺寸宽度
-
setMinimumHeight()
设置最小尺寸高度
-
setMinimumSize()
设置最小尺寸
-
setMaximumWidth()
设置最大尺寸宽度
-
setMaximumHeight()
设置最大尺寸高度
-
setMaximumSize()
最设置大尺寸
-
3.3.1.3 注意

控件完全展示前后会有差异

3.4 内容边距

3.4.1 API

API功能备注
setContentsMargins(左,上,右,下)
设置内容边距
-
getContentsMargins()
获取内容边距
(左,上,右,下), turple
contentsRect()
设置内容边距
-

注意:必须是控件本身留够对应的大小

3.4.2 应用场景

调整控件内容边距,使得显示更加好看

3.4.3 案例

创建一个窗口,包含一个标签
要求:

  1. 标签内容为xujie
  2. 标签大小为100, 60
  3. 将内容放在标签右下角
from PyQt5.Qt import *import sysif __name__ == '__main__':app = QApplication(sys.argv)window = QWidget()window.setWindowTitle('内容边距')window.resize(500, 500)label = QLabel(window)label.setText('xujie')label.resize(100, 60)label.move(200, 200)label.setStyleSheet('background-color: cyan;')label.setContentsMargins(60, 40, 0, 0)print(label.getContentsMargins())window.show()sys.exit(app.exec_())

运行结果:
在这里插入图片描述

3.5 鼠标操作

3.5.1 API

3.5.1.1 设置鼠标形状

setCursor(鼠标参数)
参数:

  1. Qt.ArrowCursor
    在这里插入图片描述
  2. Qt.UpArrowCursor
    在这里插入图片描述
  3. Qt.CrossCursor
    在这里插入图片描述
  4. Qt.IBeamCursor
    在这里插入图片描述
  5. Qt.WaitCursor
    在这里插入图片描述
  6. Qt.BusyCursor
    在这里插入图片描述
  7. Qt.ForbiddenCursor
    在这里插入图片描述
  8. Qt.PointingHandCursor
    在这里插入图片描述
  9. Qt.WhatsThisCursor
    在这里插入图片描述
  10. Qt.SizeVerCursor
    在这里插入图片描述
  11. Qt.SizeHorCursor
    在这里插入图片描述
  12. Qt.SizeBDiagCursor
    在这里插入图片描述
  13. Qt.SizeAllCursor
    在这里插入图片描述
  14. Qt.SplitVCursor
    在这里插入图片描述
  15. Qt.SplitHCursor
    在这里插入图片描述
  16. Qt.OpenHandCursor
    在这里插入图片描述
  17. Qt.ClosedHandCursor
    在这里插入图片描述
  18. Qt.BlankCursor
    在这里插入图片描述
  19. 自定义
    QCurser对象
3.5.1.2 重置形状

unsetCursor()

3.5.1.3 获取鼠标

cursor() -> QCursor

3.5.1.4 鼠标跟踪
API功能备注
hasMouseTracking()
判定是否设置了鼠标跟踪
-
setMouseTracking(bool)
设置鼠标是否跟踪
①所谓鼠标跟踪,就是设置检测鼠标移动事件的条件;
②不跟踪:鼠标移动时,必须处于按下状态,才会触发mouseMoveEvent事件;
③跟踪:鼠标移动时,不处于按下状态,也会触发mouseMoveEvent事件
3.5.1.5 QCursor对象
API功能备注
pixmap()
设置鼠标样式
-
pos()
查询鼠标位置
-
setPos(x, y)
设置鼠标位置
-

3.5.2 应用场景

根据特定场景, 设置鼠标样式; 使得用户交互时更加明确

3.5.3 案例

创建一个窗口, 内部有一个label控件
要求:

  1. 鼠标移入窗口时, 让label位置跟随鼠标位置
  2. 让鼠标设置为指定图标
from PyQt5.Qt import *
import sysclass MyWidget(QWidget):def mouseMoveEvent(self, a0):"""重写鼠标移动事件方法"""print(a0.localPos())label = self.findChild(QLabel)label.move(int(a0.localPos().x()), int(a0.localPos().y()))if __name__ == '__main__':app = QApplication(sys.argv)window = MyWidget()window.setWindowTitle('鼠标操作')window.resize(500, 500)# 设置鼠标跟踪if not window.hasMouseTracking():window.setMouseTracking(True)# 设置一个标签控件label = QLabel(window)label.setText('我是标签')label.setStyleSheet('background-color: cyan;')label.move(200, 200)# 设置指定图标pixmap = QPixmap('img.png').scaled(50, 50)cursor = QCursor(pixmap, 10, 10)window.setCursor(cursor)window.show()sys.exit(app.exec_())

运行结果:
在这里插入图片描述

3.6 事件

3.6.1 API

3.6.1.1 显示和关闭事件
API功能备注
showEvent(QShowEvent)
控件显示时调用
-
closeEvent(QCloseEvent)
控件关闭时调用
-
3.6.1.2 移动事件
API功能备注
moveEvent(QMoveEvent)
控件移动时调用
-
3.6.1.3 调整大小
API功能备注
resizeEvent(QResizeEvent)
控件调整大小时调用
-
3.6.1.4 鼠标事件
API功能备注
enterEvent(QEvent)
鼠标进入时触发
-
leaveEvent(QEvent)
鼠标离开时触发
-
mousePressEvent(QMouseEvent)
鼠标按下时触发
-
mouseReleaseEvent(QMouseEvent)
鼠标释放时触发
-
mouseDoubleClickEvent(QMouseEvent)
鼠标双击时触发
-
mouseMoveEvent(QMouseEvent)
鼠标按下后移动时触发(设置追踪后,没有按下也可以触发)
-
3.6.1.5 键盘事件
API功能备注
keyPressEvent(QKeyEvent)
键盘按下时触发
-
keyReleaseEvent(QKeyEvent)
键盘释放时触发
-
3.6.1.6 焦点事件
API功能备注
focusInEvent(QFocusEvent)
获取焦点时调用
-
focusOutEvent(QFocusEvent)
失去焦点时调用
-
3.6.1.7 拖拽事件
API功能备注
dragEnterEvent(QDragEnterEvent)
拖拽进入控件时调用
-
dragLeaveEvent(QDragLeaveEvent)
拖拽离开控件时调用
-
dragMoveEvent(QDragMoveEvent)
拖拽在控件移动时调用
-
dropEvent(QDropEvent)
拖拽放下时调用
-
3.6.1.8 绘制事件
API功能备注
paintEvent(QPaintEvent)
显示控件,更新控件时调用
-
3.6.1.9 改变事件
API功能备注
changeEvent(QEvent)
窗体改变,字体改变时调用
-
3.6.1.10 右键菜单
API功能备注
contextMenuEvent(QContextMenuEvent)
访问右键菜单时调用
-
3.6.1.11 输入法
API功能备注
inputMethodEvent(QInputMethodEvent)
输入法时调用
-

3.6.2 应用场景

  1. 当一个控件被触发了一个特定的行为时, 就会调用特定的方法, 来将事件传递给开发人员, 方便处理
  2. 重写这些事件方法, 就可以监听相关的信息

3.6.3 案例1

创建一个窗口包含一个标签
要求:

  1. 鼠标进入标签时, 展示"欢迎光临"
  2. 鼠标离开标签时, 展示"谢谢惠顾"
from PyQt5.Qt import *import sysclass QWindow(QWidget):"""window窗口类"""def __init__(self):super().__init__()def enterEvent(self, a0):label = self.findChild(QLabel)label.setText('欢迎光临')def leaveEvent(self, a0):label = self.findChild(QLabel)label.setText('请慢走')class MyLabel(QLabel):"""label控件类"""def __init__(self, parent=None):super().__init__(parent)self.setStyleSheet('background-color: cyan;')self.move(350, 480)self.setText('Hello,你好')self.setFixedSize(120, 20)font = QFont("Hei", 10)font.setBold(True)self.setFont(font)self.setAlignment(Qt.AlignCenter)if __name__ == '__main__':app = QApplication(sys.argv)window = QWindow()window.setWindowTitle('事件消息')window.resize(500, 500)# 创建一个标签label = MyLabel(window)window.show()sys.exit(app.exec_())

运行结果:
在这里插入图片描述

3.6.4 案例2

创建一个窗口, 监听用户按键
要求:

  1. 监听用户输入Tab键
  2. 监听用户输入Ctrl+S组合键
  3. 监听用户输入Ctrl+Shift+A

补充:修饰键,多个修饰键使用或运算

API功能备注
Qt.NoModifier
没有修饰键
-
Qt.ShiftModifier
Shift被按下
-
Qt.ControlModifier
Control被按下
-
Qt.AltModifier
Alt被按下
-

补充:普通键:Qt.Key_xxx

from PyQt5.Qt import *import sysclass MyWindow(QWidget):def __init__(self):super().__init__()self.label = MyLabel(self)def keyPressEvent(self, a0):"""键盘输入监听方法"""if a0.key() == Qt.Key_Tab:self.label.setText('用户点击了Tab键')if a0.modifiers() == Qt.ControlModifier and a0.key() == Qt.Key_S:self.label.setText('用户点击了Ctrl+S键')if a0.modifiers() == Qt.ControlModifier | Qt.ShiftModifier and Qt.Key_A:self.label.setText('用户点击了Ctrl+Shift+A键')class MyLabel(QLabel):"""label控件类"""def __init__(self, parent=None):super().__init__(parent)self.setStyleSheet('background-color: cyan;')self.move(0, 480)self.setText('Hello,你好')self.setFixedSize(500, 20)font = QFont("Hei", 10)font.setBold(True)self.setFont(font)self.setAlignment(Qt.AlignCenter)if __name__ == '__main__':app = QApplication(sys.argv)window = MyWindow()window.setWindowTitle('事件消息')window.resize(500, 500)window.show()sys.exit(app.exec_())

运行结果:
在这里插入图片描述

3.6.5 案例3

完成窗口, 用户区支持拖拽
要求:

  1. 鼠标点击了用户区拖拽也可以移动窗口
from PyQt5.Qt import *import sysclass MyWindow(QWidget):def __init__(self):super().__init__()self.origin_y = Noneself.origin_x = Noneself.mouse_y = Noneself.mouse_x = Noneself.move_flag = Falseself.label = MyLabel(self)def mousePressEvent(self, a0):"""鼠标按下方法"""if a0.button() == Qt.LeftButton:self.move_flag = True# 确定两个点:鼠标第一次按下的点,窗口当前所在的原始点self.mouse_x = a0.globalX()self.mouse_y = a0.globalY()self.origin_x = self.x()self.origin_y = self.y()def mouseMoveEvent(self, a0):"""鼠标移动方法"""if self.move_flag:move_x = a0.globalX() - self.mouse_xmove_y = a0.globalY() - self.mouse_ydest_x = self.origin_x + move_xdest_y = self.origin_y + move_yself.move(dest_x, dest_y)def mouseReleaseEvent(self, a0):if self.move_flag:self.move_flag = Falseclass MyLabel(QLabel):"""label控件类"""def __init__(self, parent=None):super().__init__(parent)self.setStyleSheet('background-color: cyan;')self.move(0, 480)self.setText('Hello,你好')self.setFixedSize(500, 20)font = QFont("Hei", 10)font.setBold(True)self.setFont(font)self.setAlignment(Qt.AlignCenter)if __name__ == '__main__':app = QApplication(sys.argv)window = MyWindow()window.setWindowTitle('事件消息')window.resize(500, 500)window.show()sys.exit(app.exec_())

3.7 父子关系

3.7.1 API

API功能备注
childAt(x, y)
获取在指定坐标的控件
-
parentWidget()
获取指定控件的父控件
-
childrenRect()
所有子控件组成的边界矩形
-

3.7.2 应用场景

看着用吧

3.7.3 案例

创建窗口, 包含若干label控件
要求:

  1. 点击哪个标签,就让哪个标签变红
  2. 使用父控件处理,不可以使用自定义Label控件呦
from PyQt5.Qt import *import sys# class MyWidget(QLabel):
#     def mousePressEvent(self, event):
#         self.setStyleSheet("background-color: cyan;")class Window(QWidget):def mousePressEvent(self, event):local_x = event.pos().x()local_y = event.pos().y()sub_widget = self.childAt(local_x, local_y)if sub_widget:sub_widget.setStyleSheet("background-color: cyan;")if __name__ == '__main__':app = QApplication(sys.argv)window = Window()window.setWindowTitle('事件消息')window.resize(600, 600)for i in range(1, 11):label = QLabel(window)label.setText('标签'+str(i))label.move(50*i, 50*i)window.show()sys.exit(app.exec_())

运行结果:
在这里插入图片描述

3.8 层级控制

3.8.1 API

注意: 以下操作专指同级控件
API功能备注
lower()
将控件降低到最底层
-
raise_()
将控件提升到最上层
-
a.stackUnder(b)
让a放到b下面
-

3.8.2 应用场景

需要调整控件Z轴顺序

3.9 顶层窗口相关

3.9.1 API

3.9.1.1 图标
API功能备注
setWindowIcon(QIcon(str))
设置窗口图标
-
windowIcon()
获取窗口图标
-
3.9.1.2 标题
API功能备注
setWindowTitle(str)
设置窗口标题
-
windowTitle()
获取窗口标题
-
3.9.1.3 不透明度
API功能备注
setWindowOpacity(float)
设置窗口不透明度
1.0:不透明;0.0透明
windowOpacity()
获取窗口不透明度
-
3.9.1.4 窗口状态
API功能备注
setWindowState(state)
设置窗口状态
Qt.WindowNoState-无状态
Qt.WindowMinimized-最小化
Qt.WindowMaximized-最大化
Qt.WindowFullScreen-全屏
Qt.WindowActive-活动窗口
windowState()
获取窗口状态
-
3.9.1.5 最大化最小化
API功能备注
showFullScreen()
全屏显示
不包含框架
showMaximized()
最大化
包括窗口框架
showMinimized()
最小化
-
showNormal()
正常窗口
-
isMinimized()
是否最小化窗口
-
isMaximized()
是否最大化窗口
-
isFullScreen()
是否全屏
-
3.9.1.6 窗口标志
3.9.1.6.1 window.setWindowFlags(参数)

参数介绍:

  1. 窗口样式
参数功能备注
Qt.Widget
默认
窗口或控件,如果没有父控件,则包含窗口边框和标题栏
Qt.Window
窗口,有窗口边框和标题
-
Qt.Dialog
对话框窗口
-
Qt.Sheet
窗口或部件Macintosh表单
-
Qt.Drawer
窗口或部件Macintosh抽屉
-
Qt.Popup
弹出式顶层窗口
-
Qt.Tool
工具窗口
-
Qt.SplashScreen
欢迎窗口,是QSplashScreen构造函数的默认值
-
Qt.ToolTip
提示窗口,没有标题栏和窗口边框
-
Qt.SubWindow
子窗口
-
  1. 顶层窗口外观标志
参数功能
Qt.MSWindowsFixedSizeDialogHint
窗口无法调整大小
Qt.FramelessWindowHint
窗口无边框
Qt.CustomizeWindowHint
有边框但无标题栏和按钮,不能移动和拖动
Qt.WindowTitleHint
添加标题栏和一个关闭按钮
Qt.WindowSystemMenuHint
添加系统目录和一个关闭按钮
Qt.WindowMaximizeButtonHint
激活最大化和关闭按钮,禁止最小化按钮
Qt.WindowMinimizeButtonHint
激活最小化和关闭按钮,禁止最大化按钮
Qt.WindowMinMaxButtonsHint
激活最小化,最大化和关闭按钮
Qt.WindowCloseButtonHint
添加一个关闭按钮
Qt.WindowContextHelpButtonHint
添加问号和关闭按钮,同对话框
Qt.WindowStaysOnTopHint
窗口始终处于顶层位置
Qt.WindowStaysOnBottomHint
窗口始终处于底层位置
3.9.1.6.2 windowFlags()

获取窗口标志

3.9.2 应用场景

调整整个应用程序窗口外观

3.9.3 案例

创建窗口
要求:

  1. 无边框无标题栏
  2. 窗口半透明
  3. 自定义最小化, 最大化, 关闭按钮
  4. 支持拖拽用户区移动
from PyQt5.Qt import *import sysclass Window(QWidget):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.move_flag = Falseself.min_btn = Noneself.max_btn = Noneself.close_btn = None# 公共数据self.top_margin = 10self.btn_w = 80self.btn_h = 40# 去掉边框以及标题栏self.setWindowFlag(Qt.FramelessWindowHint)self.resize(500, 500)self.setWindowTitle('窗口案例')# 变成半透明self.setWindowOpacity(0.9)self.initUI()def initUI(self):"""控件操作方法"""# 添加三个子控件 - 窗口右上角self.close_btn = QPushButton(self)self.close_btn.setText('关闭')self.close_btn.resize(self.btn_w, self.btn_h)self.max_btn = QPushButton(self)self.max_btn.setText('最大化')self.max_btn.resize(self.btn_w, self.btn_h)self.min_btn = QPushButton(self)self.min_btn.setText('最小化')self.min_btn.resize(self.btn_w, self.btn_h)self.close_btn.pressed.connect(self.close)def normal():if self.isMaximized():self.showNormal()self.max_btn.setText('最大化')else:self.showMaximized()self.max_btn.setText('恢复')self.max_btn.pressed.connect(normal)self.min_btn.pressed.connect(self.showMinimized)def resizeEvent(self, a0):"""窗口适应方法"""window_w = self.width()close_btn_x = window_w - self.btn_wself.close_btn.move(close_btn_x, self.top_margin)max_btn_x = close_btn_x - self.btn_wself.max_btn.move(max_btn_x, self.top_margin)min_btn_x = max_btn_x - self.btn_wself.min_btn.move(min_btn_x, self.top_margin)def mousePressEvent(self, a0):"""鼠标按下方法"""if a0.button() == Qt.LeftButton:self.move_flag = True# 确定两个点:鼠标第一次按下的点,窗口当前所在的原始点self.mouse_x = a0.globalX()self.mouse_y = a0.globalY()self.origin_x = self.x()self.origin_y = self.y()def mouseMoveEvent(self, a0):"""鼠标移动方法"""if self.move_flag:move_x = a0.globalX() - self.mouse_xmove_y = a0.globalY() - self.mouse_ydest_x = self.origin_x + move_xdest_y = self.origin_y + move_yself.move(dest_x, dest_y)def mouseReleaseEvent(self, a0):if self.move_flag:self.move_flag = Falseif __name__ == '__main__':app = QApplication(sys.argv)# 去掉边框以及标题栏window = Window()# window = QWidget(flags=Qt.FramelessWindowHint)window.show()sys.exit(app.exec_())

运行结果:
在这里插入图片描述

3.10 控件交互

3.10.1 API

3.10.1.1 是否可用
API功能备注
setEnabled(bool)
设置控件是否禁用
-
isEnabled()
获取控件是否禁用
-
3.10.1.2 是否显示/隐藏
API功能备注
setVisible(bool)
设置控件是否可见
传递的参数值为True也不一定可见。
马甲:setHidden(bool), show()展示控件;hide()隐藏控件
isHidden()
判断控件是否隐藏
一般是基于父控件可见
isVisible()
获取控件最终状态是否可见
-
isVisibleTo(widget)
如果随着widget控件的显示和隐藏,而同步变化,则返回True
-
3.10.1.3 是否编辑

设置窗口标题:xxx[*]

API功能备注
setWindowModified(bool)
-
被编辑状态:显示*
没有被编辑:不显示*
isWindowModified()
窗口是否为被编辑状态
-
3.10.1.4 关闭

close()
补充:setAttribute(Qt.WA_DeleteOnClose, True) :窗口在被关闭时(例如用户点击关闭按钮或调用 close() 方法时),会自动销毁并释放其占用的内存。

3.10.1.5 注意

visible: 代表最终控件状态,是否被我们可见(被其他控件遮挡也属于可见)
hide: 可理解为相对父控件可见
隐藏不一定是可见的,反之不然

3.10.2 应用场景

合适的时候,设置不用的状态,来控制交互逻辑

3.10.3 案例

创建一个窗口,包含一个文本框,一个按钮,一个标签
要求:

  1. 默认情况下:①标签隐藏;②文本框按钮显示;③按钮设置为不可用状态
  2. 当文本框有内容时,让按钮可用,否则为不可用
  3. 当文本框内容为xujie时,点击按钮则显示标签,并展示文本为登录成功,否则为登录失败
  4. 支持拖拽用户区移动
from PyQt5.Qt import *
import sysclass Window(QWidget):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.resize(600, 600)# 设置窗口图标icon = QIcon('cats1.ico')self.setWindowIcon(icon)# 设置标题self.setWindowTitle('控件交互')self.initUI()def initUI(self):# 添加控件label = QLabel(self)label.setText('标签')label.move(100, 50)label.hide()l_edit = QLineEdit(self)l_edit.move(100, 100)btn = QPushButton(self)btn.setText('登录')btn.move(100, 150)btn.setEnabled(False)def text_cao(text):print('文本内容发生改变', text)if len(text) > 0:btn.setEnabled(True)else:btn.setEnabled(False)def check():print('按钮被点击了')content = l_edit.text()if content == 'xujie':label.show()label.setText('登录成功')label.adjustSize()else:label.show()label.setText('登录失败')label.adjustSize()l_edit.textChanged.connect(text_cao)btn.pressed.connect(check)if __name__ == '__main__':app = QApplication(sys.argv)window = Window()window.show()sys.exit(app.exec_())

3.11 信息提示

3.11.1 API

API功能备注
setStatusTip(str)/statusTip()
状态提示
鼠标悬停在控件上时,展示在状态栏
setToolTip(str)/toolTip()
工具提示
鼠标悬停在控件上时,展示在旁边
setToolTipDuration(msec)/toolTipDuration()
工具提示时长
鼠标悬停在控件上时,展示在旁边一定时间
setWhatThis(str)/whatsThis()
这是啥提示
切换到查看这是啥模式,点击控件显示

3.12 焦点控制

3.12.1 API

3.12.1.1 单个控件角度
API功能备注
setFocus()
指定控件获取焦点
-
setFocusPolicy(Policy)
设置焦点策略
①Qt.TabFocus: 通过Tab获得焦点;
②Qt.ClickFocus: 通过单击获得焦点;
③Qt.StrongFocus: 通过两种方式获得焦点;
④Qt.NoFocus: 不通过上面方式获得焦点;
clearFocus()
取消焦点
-
3.12.1.2 父控件角度
API功能备注
focusWidget()
获取子控件中当前聚焦的控件
-
focusNextChild()
聚集下一个控件
-
focusPreviousChild()
聚集上一个控件
-
focusNextPrevChild(bool)
True:上一个
False:下一个
-
setTabOrder(pre_widget, next_widget)
设置子控件获取焦点的顺序
静态方法

3.12.2 应用场景

结合程序的业务逻辑,来调整焦点操作

3.13 其他操作(不重要)

3.12.1.2 父控件角度
列表API解释
属性
setAttribute(Qt :: WidgetAttribute 属性,bool on = true)
-
遮罩
QWidget :: mask()const
返回当前在小部件上设置的遮罩。如果没有设置掩码,返回值将是一个空白区域。
另请参阅setMask(),clearMask(),QRegion :: isEmpty()和形状时钟示例。
内容拖拽
setAcceptDrops()/acceptDrops()
-
交互控制
①scroll(int dx,int dy)
②repaint()
-
动作行为
①addAction(QAction * action)
②removeAction(),insertAction(),actions()
-
状态控件
①keyboardGrabber()
②mouseGrabber()
③grabMouse()
④nextInFocusChain()
⑤previousInFocusChain()
⑥releaseKeyboard()
-
快捷方式
①setShortcutAutoRepeat(int id,bool enable = true)
②setShortcutEnabled(int id,bool enable = true)
③grabShortcut()
④releaseShortcut()
-
坐标转换
①mapFrom(const QWidget * parent,const QPoint& pos)
② mapFromGlobal(const QPoint& pos)const
③将全局屏幕坐标pos转换为小部件坐标。
④又见mapToGlobal(),mapFrom(),和mapFromParent()。
⑤: mapTo(const QWidget * parent,const QPoint& pos)const
⑥将小部件坐标pos转换为父项的坐标系。在父母不能为0,且必须调用控件的父。
⑦又见mapFrom(),mapToParent(),mapToGlobal(),和underMouse()。
⑧QPoint QWidget :: mapToGlobal(const QPoint& pos)const
-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/502337.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux(Centos 7.6)命令详解:ls

1.命令作用 列出目录内容(list directory contents) 2.命令语法 Usage: ls [OPTION]... [FILE]... 3.参数详解 OPTION: -l,long list 使用长列表格式-a,all 不忽略.开头的条目(打印所有条目,包括.开头的隐藏条目&#xff09…

unity学习6:unity的3D项目的基本界面和菜单

目录 1 unity界面的基本认识 1.1 file 文件 1.2 edit 编辑/操作 1.3 Assets 1.4 gameobject 游戏对象 1.5 组件 1.6 windows 2 这些部分之间的关系 2.1 关联1: Assets & Project 2.2 关联2:gameobject & component 2.3 关联3&#xf…

生成模型的现状2025年的新兴趋势

2024年对人工智能而言是极为出色的一年。在文本生成和图像生成这两方面,我们目睹了模型能力全方位出现了类似阶跃函数般的巨大提升。这一年起始时OpenAI占据主导地位,而到了年末,Anthropic的Claude成了我常用的大型语言模型,并且还…

PWN 的知识之如何利用栈溢出利用后门函数

PWN 的知识之如何利用栈溢出利用后门函数 利用栈溢出漏洞调用原本存在的后门函数(例如 get_flag 或system("/bin/sh"))是二进制漏洞利用中的一种常见技术,相信各位网安的师傅或多或少都听说过,那么如何利用栈溢出来利用后门函数呢…

基于YOLO11的道路缺陷检测系统

基于YOLO11的道路缺陷检测系统 (价格90) 包含 [cracks, potholes] [裂缝, 凹坑] 2个类 通过PYQT构建UI界面,包含图片检测,视频检测,摄像头实时检测。 (该系统可以根据数据训练出的yolo11的权重文件,运用在其他…

JAVA:Spring Boot 集成 Quartz 实现分布式任务的技术指南

1、简述 Quartz 是一个强大的任务调度框架,允许开发者在应用程序中定义和执行定时任务。在 Spring Boot 中集成 Quartz,可以轻松实现任务的调度、管理、暂停和恢复等功能。在分布式系统中,Quartz 也支持集群化的任务调度,确保任务…

数据分析-Excel

数据类型和函数初步 Excel中有文本类型和数值类型–但是无法用肉眼分辨出来isnumber来区分是否是数值类型text和value函数可以完成数值类型以及文本类型的转换单元格第一位输入’方式明确输入的是文本sum函数必须是数值类型 文本连接-and-or-not-if-mod-max函数 字符串的连接…

深入了解 SSL/TLS 协议及其工作原理

深入了解 SSL/TLS 协议及其工作原理 一. 什么是 SSL/TLS?二. SSL/TLS 握手过程三. SSL/TLS 数据加密与传输四. 总结 点个免费的赞和关注,有错误的地方请指出,看个人主页有惊喜。 作者:神的孩子都在歌唱 一. 什么是 SSL/TLS? 安全套接层&am…

【NLP高频面题 - Transformer篇】Transformer的输入中为什么要添加位置编码?

Transformer的输入中为什么要添加位置编码? 重要性:★★★ Transformer 将句子中的所有词并行地输入到神经网络中。并行输入有助于缩短训练时间,同时有利于学习长期依赖。不过,并行地将词送入 Transformer,却不保留词…

【Unity3D】UGUI Canvas画布渲染流程

目录 Screen Space - Overlay Screen Space - Camera World Space UI合批分析(建议不看 直接看FrameDebugger测试) 优化UI合批 1、Image图片纹理不同导致合批失败 2、文本和图片相交以及排序对合批的影响 参考文档:画布 - Unity 手册…

计算机的错误计算(二百零一)

摘要 用两个大模型计算 ,结果保留 10位有效数字。实验表明,两个大模型的输出均只有1位正确数字;并它们几乎相同:仅最后1位数字不同。 例1. 计算 , 结果保留 10位有效数字。 下面是与一个数学解题器的对话。 以上为与一个数学解…

完全分布式部署Hadoop集群

(1)第一步:安装Hadoop,使用如下命令: tar -zvxf /export/software/Hadoop-3.3.4.tar.gz -C /export/servers (2)第二步:配置Hadoop系统环境变量 在liumengting1上执行vi /etc/profile命令配置系统环境变量profile,在…

Redis数据库笔记—— Hash(哈希)的扩容机制(rehash)

大家好,这里是Good Note,关注 公主号:Goodnote,专栏文章私信限时Free。详细介绍Hash(哈希)的扩容机制(rehash)、源码、以及扩容和缩容过程。 文章目录 Redis 字典(dict)结构源码哈希…

使用命令行管理git项目

# 初始化一个新的Git仓库 git init # 添加文件到暂存区 git add <file> # 提交暂存区的更改到仓库 git commit -m "commit message" # 查看当前仓库的状态 git status # 查看提交历史 git log # 查看文件的改动 git diff <file> # 创建一个新…

设计模式 创建型 工厂模式(Factory Pattern)与 常见技术框架应用 解析

工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种封装对象创建过程的方式&#xff0c;使得对象的创建与使用分离&#xff0c;从而提高了系统的可扩展性和可维护性。 一、核心思想 工厂模式的核心思想是将“实例化对象”的操作与…

【Block总结】Conv2Former中的Block,卷积调制块,简化了自注意力机制,提高了内存效率

论文介绍 论文链接&#xff1a;https://arxiv.org/pdf/2211.11943 研究背景&#xff1a;论文指出&#xff0c;尽管当前研究者们通过利用大核卷积、高阶空间交互或稀疏卷积核等方法对卷积神经网络&#xff08;ConvNets&#xff09;的设计进行了重新思考&#xff0c;但如何更有…

w139华强北商城二手手机管理系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

ThreadPoolExecutor keepAliveTime 含义

现象 在线上环境排查问题时&#xff0c;某个线程池在某个时间点新建线程达到设定的最大线程数 maximumPoolSize&#xff0c;后续流量降低后当前线程数仍未回落&#xff0c;仍然为最大线程数&#xff0c;阻塞队列中有任务&#xff0c;但是活跃线程数显著减少。 之前的认知 固…

如何恢复已删除的 Telegram 消息 [iOSamp;Android]

Telegram 是一款功能强大的消息应用程序&#xff0c;因其易用性、隐私保护和众多炫酷功能而深受用户喜爱。然而&#xff0c;有时我们会不小心删除重要的消息。在这种情况下你应该做什么&#xff1f; 本文将为您提供简单有效的解决方案来恢复 Telegram 上已删除的消息&#xff…

Outlook2024版如何回到经典Outlook

Outlook2024版如何回到经典Outlook 如果新加入一家公司&#xff0c;拿到的电脑&#xff0c;大概率是最新版的Windows, 一切都是新的。 如果不coding, 使用国产的foxmail大概就可以解决一切问题了。可惜老程序员很多Coding都是基于传统Outlook的&#xff0c;科技公司所有人都是I…