【GUI-pyqt5】QWidget类

news2025/1/7 17:11:22

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 sys

if __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 sys

if __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 + 1
    widget_height = window.height() / row_count

    for i in range(0, widget_count):
        w = QWidget(window)
        w.resize(int(widget_width), int(widget_height))
        widget_x = i % column_count * widget_width
        widget_y = i // column_count * widget_height
        w.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 sys

if __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 sys

class 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 sys


class 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 sys

class 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 sys


class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.origin_y = None
        self.origin_x = None
        self.mouse_y = None
        self.mouse_x = None
        self.move_flag = False
        self.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_x
            move_y = a0.globalY() - self.mouse_y
            dest_x = self.origin_x + move_x
            dest_y = self.origin_y + move_y
            self.move(dest_x, dest_y)

    def mouseReleaseEvent(self, a0):
        if self.move_flag:
            self.move_flag = False


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.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 sys

class Window(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.move_flag = False
        self.min_btn = None
        self.max_btn = None
        self.close_btn = None
        # 公共数据
        self.top_margin = 10
        self.btn_w = 80
        self.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_w
        self.close_btn.move(close_btn_x, self.top_margin)
        
        max_btn_x = close_btn_x - self.btn_w
        self.max_btn.move(max_btn_x, self.top_margin)
        
        min_btn_x = max_btn_x - self.btn_w
        self.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_x
            move_y = a0.globalY() - self.mouse_y
            dest_x = self.origin_x + move_x
            dest_y = self.origin_y + move_y
            self.move(dest_x, dest_y)

    def mouseReleaseEvent(self, a0):
        if self.move_flag:
            self.move_flag = False
        



if __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 sys

class 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.coloradmin.cn/o/2272041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot Maven 项目 pom 中的 plugin 插件用法整理

把 SpringBoot Maven 项目打包成 jar 文件时,我们通常用到 spring-boot-maven-plugin 插件。 前面也介绍过,在 spring-boot-starter-parent POM 和 spring-boot-starter POM 中都有插件的管理,现在我们就撸一把构建元素中插件的用法。 一、…

springboot实战纪实-课程介绍

教程介绍 Spring Boot是由Pivotal团队提供的一套开源框架,可以简化spring应用的创建及部署。它提供了丰富的Spring模块化支持,可以帮助开发者更轻松快捷地构建出企业级应用。 Spring Boot通过自动配置功能,降低了复杂性,同时支持…

源代码编译安装X11及相关库、vim,配置vim(2)

一、编译安装vim 编译时的cofigure选项如下.只有上一步的X11的包安装全了(具体哪些是必须的,哪些是多余的没验证),configure才能认为X的库文件和头文件是可以用的 ./configure --prefixpwd/mybuild \--x-includes/path/to/X11/m…

直接插入排序、折半插入排序、2路插入排序、希尔排序

本篇是排序专栏博客的第一篇,主要探讨以 “插入” 为核心思想的排序算法该如何实现 文章目录 一、前言二、直接插入排序1. 算法思想与操作分析2. 代码实现version 1version 2 3. 复杂度分析 三、折半插入排序1. 算法思想与操作分析2. 代码实现3. 复杂度分析 四、2路…

Ansible之批量管理服务器

文章目录 背景第一步、安装第二步、配置免密登录2.1 生成密钥2.2 分发公钥2.3 测试无密连接 背景 Ansible是Python强大的服务器批量管理 第一步、安装 首先要拉取epel数据源,执行以下命令 yum -y install epel-release安装完毕如下所示。 使用 yum 命令安装 an…

让 Agent 具备语音交互能力:技术突破与应用前景(16/30)

让 Agent 具备语音交互能力:技术突破与应用前景 一、引言 在当今数字化时代,人机交互方式正经历着深刻的变革。从早期的命令行界面到图形用户界面,再到如今日益普及的语音交互,人们对于与机器沟通的便捷性和自然性有了更高的追求…

学生作业完成情况管理程序

网上看到的一个课程设计,正好练练手。 首先设计数据库 数据库有三张表,分别是班级表,学生表,作业成绩表。 学生表中外键关联班级表,作业成绩表中外键关联学生表。具体如下图所示 班级表 学生表学生表外键关联 …

基于vue的商城小程序的毕业设计与实现(源码及报告)

环境搭建 ☞☞☞ ​​​Vue入手篇(一),防踩雷(全网最详细教程)_vue force-CSDN博客 目录 一、功能介绍 二、登录注册功能 三、首页 四、项目截图 五、源码获取 一、功能介绍 用户信息展示:页面顶部设有用户头像和昵称展示区,方便用户识别…

DeepSeek V3“报错家门”:我是ChatGPT

搜 :海讯无双Ai 要说这两天大模型圈的顶流话题,那绝对是非DeepSeek V3莫属了。 不过在网友们纷纷测试之际,有个bug也成了热议的焦点—— 只是少了一个问号,DeepSeek V3竟然称自己是ChatGPT。 甚至让它讲个笑话,生成…

利用webworker解决性能瓶颈案例

目录 js单线程的问题webworker的基本使用webworker的常见应用可视化优化导出Excel js单线程的问题 众所周知,js不擅长计算,计算是同步的,大规模的计算会让js主线程阻塞,导致界面完成卡死。比如有一个600多亿次的计算,…

深入理解卷积神经网络(CNN):图像识别的强大工具

1、引言 卷积神经网络(CNN)是一种深度学习模型,特别适合分析视觉数据。它们在处理图像和视频任务时表现尤为出色。由于CNN在物体识别方面的高效性,这种网络架构广泛应用于计算机视觉领域,例如图像分类、物体检测、面部…

R语言安装教程与常见问题

生物信息基础入门笔记 R语言安装教程与常见问题 今天和大家聊一个非常基础但是很重要的技术问题——如何在不同操作系统上安装R语言?作为生物信息学数据分析的神兵利器,R语言的安装可谓是入门第一步,学术打工人的必备技能。今天分享在Windows…

VOC数据集格式转YOLO格式

将VOC格式的数据集转换为YOLO格式通常涉及以下几个步骤。YOLO格式的标注文件是每个图像对应一个.txt文件&#xff0c;文件中每一行表示一个目标&#xff0c;格式为&#xff1a; <class_id> <x_center> <y_center> <width> <height>其中&#xf…

win10搭建zephyr开发环境

搭建环境基于 zephyr官方文档 基于官方文档一步一步走很快就可以搞定 一、安装chocolatey 打开官网 https://community.chocolatey.org/courses/installation/installing?methodinstall-from-powershell-v3 1、用管理员身份打开PowerShell &#xff08;1&#xff09;执行 …

物体切割效果

1、物体切割效果是什么 在游戏开发中&#xff0c;物体切割效果就是物体看似被切割、分割或隐藏一部分的视觉效果。 这种效果常用与游戏和动画中&#xff0c;比如角色攻击时的切割效果&#xff0c;场景中的墙壁切割效果等等。 2、物体切割效果的基本原理 在片元着色器中判断片…

k8s集群监控系统部署方案

1.方案介绍 本文介绍一种k8s集群监控系统,该系统可以监控k8s集群中的pod和node的性能指标,以及K8s资源对象的使用情况。 监控流程: 集群资源数据采集(cadvisor、node-exporter、kube-state-metrics)-- 数据收集、存储、处理等(prometheus)-- 数据可视化查询和展示(gra…

RP2K:一个面向细粒度图像的大规模零售商品数据集

这是一种用于细粒度图像分类的新的大规模零售产品数据集。与以往专注于相对较少产品的数据集不同&#xff0c;我们收集了2000多种不同零售产品的35万张图像&#xff0c;这些图像直接在真实的零售商店的货架上拍摄。我们的数据集旨在推进零售对象识别的研究&#xff0c;该研究具…

Linux(Centos 7.6)命令详解:ls

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

比QT更高效的一款开源嵌入式图形工具EGT-Ensemble Graphics Toolkit

文章目录 EGT-Ensemble Graphics Toolkit介绍EGT具备非常高的图形渲染效率EGT采用了非常优秀的开源2D图形处理引擎-Cairo开源2D图形处理引擎Cairo的优势Cairo 2D图像引擎的性能Cairo 2D图像引擎的实际应用案例彩蛋 - 开源EDA软件KiCAD也在使用Cairo EGT高效的秘诀还有哪些Cairo…

密码学精简版

密码学是数学上的一个分支&#xff0c;同时也是计算机安全方向上很重要的基础原理&#xff0c;设置密码的目的是保证信息的机密性、完整性和不可抵赖性&#xff0c;安全方向上另外的功能——可用性则无法保证&#xff0c;可用性有两种方案保证&#xff0c;冗余和备份&#xff0…