GUI编程--PyQt5--QWidget2

news2024/11/16 0:55:06

文章目录

  • 事件
  • 事件传递
  • 父子关系扩展
  • Z轴的层级关系

事件

自定义控件类(QWidget),然后重写对应的事件方法即可。
控件显示时触发,showEvent(QShowEvent)
控件关闭时触发,closeEvent(QCloseEvent)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

事件传递

在这里插入图片描述

案例:
通过事件监听,如果按下A键 则打印“按下了A”
如果按下了Ctrl + S, 则打印 “Ctrl + S被按下”
如果按下了Ctrl + Shift + S,则打印“Ctrl + Shift + S按下”

普通按键 event.key() == Qt.Key_A/Tab…
修饰键 event.modifiers()
在这里插入图片描述
代码:

# __author__ = "laufing"

from PyQt5.QtGui import QIcon, QPixmap, QCursor, QKeyEvent
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QDesktopWidget
import sys


class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        # 窗口标题
        self.setWindowTitle("laufing")
        # 窗口图标
        pixmap = QPixmap("./imgs/dog.jpg").scaled(50, 50)
        icon = QIcon()
        icon.addPixmap(pixmap, QIcon.Normal, QIcon.Off)
        self.setWindowIcon(icon)

        # 设置宽高
        self.resize(500, 600)

        # 窗口居中
        desktop_geo = QDesktopWidget().geometry()
        width, height = desktop_geo.width(), desktop_geo.height()
        self.move(width/2-self.width()/2, height/2 - self.height()/2)

        # 设置文本
        self.label = MyLabel(self)
        self.label.setText("测试按钮被按下")
        self.label.resize(200, 200)
        self.label.move(100, 100)

        # 文本获取键盘焦点
        self.label.grabKeyboard()
        # self.label.grabMouse()


class MyLabel(QLabel):
    # 重写事件函数
    def keyPressEvent(self, evt: QKeyEvent):
        print("键盘按下...")

        # 判断按下的键
        if evt.key() == Qt.Key.Key_A:
            print("A 被按下")

        # 加修饰按键 的 组合 Ctrl + S
        elif evt.modifiers() == Qt.KeyboardModifier.ControlModifier and evt.key() == Qt.Key.Key_S:
            print("Ctrl + S 被按下")

        # 多个修饰键
        elif evt.modifiers() == Qt.KeyboardModifier.ControlModifier | Qt.KeyboardModifier.ShiftModifier \
            and evt.key() == Qt.Key.Key_S:
            print("Ctrl + Shift + S 被按下")

        else:
            print("其他按钮...")

if __name__ == '__main__':
    # 窗口应用程序
    app = QApplication(sys.argv)

    window = Window()
    window.show()


    status_code = app.exec_()
    sys.exit(status_code)

案例2:在用户区域,按下鼠标左键,可以拖动窗口,按右键就不可以拖动

# __author__ = "laufing"

from PyQt5.QtGui import QIcon, QPixmap, QCursor, QKeyEvent
from PyQt5 import QtGui
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QDesktopWidget
import sys


class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        # 窗口标题
        self.setWindowTitle("laufing")
        # 窗口图标
        pixmap = QPixmap("./imgs/dog.jpg").scaled(50, 50)
        icon = QIcon()
        icon.addPixmap(pixmap, QIcon.Normal, QIcon.Off)
        self.setWindowIcon(icon)

        # 设置宽高
        self.resize(500, 600)

        # 窗口居中
        desktop_geo = QDesktopWidget().geometry()
        width, height = desktop_geo.width(), desktop_geo.height()
        self.move(width/2-self.width()/2, height/2 - self.height()/2)

        # 设置文本
        self.label = MyLabel(self)
        self.label.setText("测试按钮被按下")
        self.label.resize(200, 200)
        self.label.move(100, 100)

        # 文本获取键盘焦点
        self.label.grabKeyboard()
        # self.label.grabMouse()

        # 移动标记
        self.move_flag = None
	# ***************************************
    # 完成鼠标点击(左键)用户区域,实现窗口的拖拽
    # 按下左键后,实现窗口左顶点  与 鼠标的顶点 同步
    def mousePressEvent(self, event: QtGui.QMouseEvent):
        # 按下的是否左键
        if event.button() == Qt.MouseButton.LeftButton:
            self.move_flag = True

            # 窗口左顶点 初始位置
            self.window_origin_x = self.x()
            self.window_origin_y = self.y()
            print("窗口初始位置:", self.window_origin_x, self.window_origin_y)

            # 鼠标顶点初始位置
            self.mouse_x = event.globalX()
            self.mouse_y = event.globalY()
            print("鼠标初始位置:", self.mouse_x, self.mouse_y)

    def mouseMoveEvent(self, event: QtGui.QMouseEvent):
        if self.move_flag:
            # 获取鼠标移动后的偏移量
            offset_x = event.globalX() - self.mouse_x
            offset_y = event.globalY() - self.mouse_y

            print("偏移量:", offset_x, offset_y)

            # 窗口移动 偏移量
            self.dest_x = self.window_origin_x + offset_x
            self.dest_y = self.window_origin_y + offset_y

            # 移动窗口
            self.move(self.dest_x, self.dest_y)

    def mouseReleaseEvent(self, event: QtGui.QMouseEvent):
        self.move_flag = False

	# ***************************************




class MyLabel(QLabel):
    # 重写事件函数
    def keyPressEvent(self, evt: QKeyEvent):
        print("键盘按下...")

        # 判断按下的键
        if evt.key() == Qt.Key.Key_A:
            print("A 被按下")

        # 加修饰按键 的 组合 Ctrl + S
        elif evt.modifiers() == Qt.KeyboardModifier.ControlModifier and evt.key() == Qt.Key.Key_S:
            print("Ctrl + S 被按下")

        # 多个修饰键
        elif evt.modifiers() == Qt.KeyboardModifier.ControlModifier | Qt.KeyboardModifier.ShiftModifier \
            and evt.key() == Qt.Key.Key_S:
            print("Ctrl + Shift + S 被按下")

        else:
            print("其他按钮...")

if __name__ == '__main__':
    # 窗口应用程序
    app = QApplication(sys.argv)

    window = Window()
    window.show()


    status_code = app.exec_()
    sys.exit(status_code)

父子关系扩展

parent.childAt(x, y)
child.parentWidget()
parent.childrenRect() 父控件下所有的子控件组成的矩形区域
在这里插入图片描述
案例:
在一个窗口里设置多个QLabel子控件,点击某个QLabel 则为选中(cyan背景),再次点击则取消(white背景)。

# 重写QLabel的点击事件
class MyLabel(QLabel):
    def __init__(self, *args, **kwargs):
        super(MyLabel, self).__init__(*args, **kwargs)
        self.flag = True

    # QLabel的点击事件
    def mousePressEvent(self, event: QtGui.QMouseEvent):
        if self.flag:
            self.setStyleSheet("background-color: cyan")
            self.flag = False
        else:
            self.setStyleSheet("background-color: white")
            self.flag = True

另外也可以重写父控件的点击事件(mousePressEvent)。

Z轴的层级关系

在这里插入图片描述
案例: 点击某个子控件,实现该子控件移动到最上层

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

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

相关文章

MYSQL -- Binlog数据还原

对表误删或执行缺少条件的修改 SQL 导致修改了表内其他数据时,我们需要想办法将数据恢复回来。 先创建两个测试表 table_1 CREATE TABLE table_1 (id int(0) NOT NULL AUTO_INCREMENT,name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL D…

SpringBoot自定义注解+AOP+redis实现防接口幂等性重复提交,从概念到实战

一、前言 在面试中,经常会有一道经典面试题,那就是:怎么防止接口重复提交? 小编也是背过的,好几种方式,但是一直没有实战过,做多了管理系统,发现这个事情真的没有过多的重视。 最近…

[附源码]java毕业设计酒店管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

K8s为何需要Pod

Pod是K8s中的最小API对象,更专业的表述是,Pod是K8s项目的原子调度单位,Pod可以看做是一个进程组,K8s则是操作系统 一, 问题 现在有三个服务需要部署在同一个节点上,A占用1G内存,B ,…

【Maven】使用maven profile 动态激活不同环境、依赖打包部署

使用maven profile 动态激活不同环境、依赖打包部署前言一、配置二、激活Profile三、动态依赖 示例一些其他参考:前言 在开发过程中,我们的软件会面对不同的运行环境,比如开发环境、测试环境、生产环境,而我们的软件在不同的环境中…

Java方法与方法重载

目录 如何使用带参数的方法 综合案例 常见错误2-1 常见错误2-2 方法传参 构造方法 构造方法重载 this的用法 方法重载 成员变量和局部变量 成员变量和局部变量的区别 如何使用带参数的方法 1、定义带参数的方法 语法&#xff1a;<访问修饰符> 返回类型 <方…

网络 IO 演变过程

在互联网中提起网络&#xff0c;我们都会避免不了讨论高并发、百万连接。而此处的百万连接的实现&#xff0c;脱离不了网络 IO 的选择&#xff0c;因此本文作为一篇个人学习的笔记&#xff0c;特此进行记录一下整个网络 IO 的发展演变过程。以及目前广泛使用的网络模型。 1.网…

服务端Skynet(一)——源码浅析

服务端Skynet(一)——源码浅析 文章目录服务端Skynet(一)——源码浅析1、skynet的本质2、skynet基本的数据结构1、skynet_modules管理模块2、skynet_context模块3、skynet_message模块3、skynet启动服务步骤4、启动服务例子(logger)参考文献&#xff1a;skynet设计综述 skynet…

实战Netty!基于私有协议,怎样快速开发网络通信服务?

前言 今天我们一起来来聊聊怎么使用netty。 在工作中&#xff0c;我经常使用netty开发一些服务&#xff0c;掌握netty的工作原理&#xff0c;开发一些服务端以及客户端是非常简单&#xff0c;本篇文章&#xff0c;我们就以具体的协议来进行一个简单的服务的开发。 正文 私有…

一键汇总报告模型可能会需要修改的地方

文章目录如何修改文件夹地址为指定地址?如何取消清除提醒, 避免每次点击弹窗选择?如何取消完成弹窗提醒?如果觉得反复打开工作簿太闪怎么办?如果有些报告的内容页不在第一个Sheet怎么办?如果想修改字段怎么办?运行程序前不想清除原有内容怎么办?报告页有内容但是没有被抓…

混合整数规划的机组组合附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

Redis常见面试题(2022)

Redis基础 什么是 Redis&#xff1f; Redis 是一个开源&#xff08;BSD 许可&#xff09;、基于内存、支持多种数据结构的存储系统&#xff0c;可以作为数据库、缓存和消息中间件。它支持的数据结构有字符串&#xff08;strings&#xff09;、哈希&#xff08;hashes&#xf…

多分类交叉熵理解

多分类交叉熵有多种不同的表示形式&#xff0c;如下图所示&#xff1a; 但是&#xff0c;有时候我们读论文会深陷其中不能自拔。 也有很多读者、观众会纠正其他作者的文章、视频的交叉熵形式。 实际上&#xff0c;上述三种形式都是没有问题的。 这里&#xff0c;我们就要了解…

多媒体内容理解在美图社区的应用实践

导读&#xff1a;移动互联网时代&#xff0c;图像和短视频等多媒体内容爆发&#xff0c;基于计算机视觉的AI算法是多媒体内容分析的基础。在美图社区智能化发展的过程中&#xff0c;视频和图像分类打标、去重以及质量评估的结果&#xff0c;在推荐、搜索以及人工审核等多个场景…

【R语言数据科学】:变量选择(三)主成分回归和偏最小二乘回归

变量选择(三)主成分回归和偏最小二乘回归 🌸个人主页:JOJO数据科学📝个人介绍:统计学top3高校统计学硕士在读💌如果文章对你有帮助,欢迎✌关注、👍点赞、✌收藏、👍订阅专栏✨本文收录于【R语言数据科学】本系列主要介绍R语言在数据科学领域的应用包括: R语言编…

多分类问题的precision和recall以及F1 scores的计算

对于多分类问题&#xff0c;首先&#xff0c;对于每一个类的精准率&#xff08;Precision&#xff09;和召回率&#xff08;Recall&#xff09;&#xff0c;定义和二分类问题一致&#xff0c;但是计算上不再需要TP,FP,FN等量了&#xff1a;&#xff09; 比如对A, B, C三类有如…

SpringBoot中如何集成ThymeLeaf呢?

转自: SpringBoot中如何集成ThymeLeaf呢&#xff1f; 下文笔者将讲述SpringBoot集成ThymeLeaf的方法&#xff0c;如下所示: 实现思路:1.在pom.xml中引入ThymeLeaf的相关依赖2.在Templates文件夹下编写相应的模板文件例: 1.pom.xml 添加ThymeLeaf依赖<!-- ThymeLeaf 依赖…

河南某商务楼BA系统设计

目 录 第一章 概述 3 第二章 设计任务与要求 4 第三章 设计依据和规范 4 第四章 系统设计 5 4.1系统选型 5 4.2 I/O点位设计 7 4.2.1暖通空调系统 11 4.2.2给排水系统 13 4.2.3电气系统 15 4.3线缆选型设计 17 4.4供电接地设计 17 4.5中央控制室设计 18 第五章 设备清单配置 18…

ASEMI代理力特LSIC1MO120E0080碳化硅MOSFET

编辑-Z 力特碳化硅MOS管LSIC1MO120E0080参数&#xff1a; 型号&#xff1a;LSIC1MO120E0080 漏极-源极电压&#xff08;VDS&#xff09;&#xff1a;1200V 连续漏电流&#xff08;ID&#xff09;&#xff1a;25A 功耗&#xff08;PD&#xff09;&#xff1a;214W 工作结温…

mysql数据库日志

1、日志类型 mysql日志在mysql事务章有事务日志相关的记录。初次之外&#xff0c;MySQL有不同类型的日志文件&#xff0c;用来存储不同类型的日志&#xff0c;分为二进制日志 、 错误日志 通用查询日志和 查询日志 &#xff0c;这也是常用的4种。MySQL 8又新增两种支持的日志&…