button 隐藏属性_PyQt5实现仿QQ贴边隐藏功能!有点意思

此程序大致功能为:可变换颜色,贴边隐藏。


变换颜色

思路

QPalette( [ˈpælət] 调色板)类相当于对话框或控件的调色板,它管理着控件或窗体的所有颜色信息,每个窗体或控件都包含一个QPalette对象,在显示时按照它的QPalette对象中对各部分各状态下的颜色的描述来进行绘制。

实现代码

def Painting(self):        color = random.choice(["CCFFFF","CC6699","CC99FF","99CCFF"])        palette1 = QPalette()        palette1.setColor(self.backgroundRole(),                          QColor("#{}".format(color))) # 改变窗体颜色        self.setPalette(palette1)

贴边隐藏

思路

可以判断窗口的位置,当与边缘的距离小于某值时,再判断鼠标是否在窗口,判断是否隐藏窗口;根据隐藏窗口的隐藏位置,获得某块区域,当鼠标在这个位置时,显示窗口。

实现代码

鼠标进入事件,调用hide_or_show判断是否该显示

def enterEvent(self, event):        self.hide_or_show('show', event)

鼠标离开事件,调用hide_or_show判断是否该隐藏

def leaveEvent(self, event):        self.hide_or_show('hide', event)

鼠标点击事件

def mousePressEvent(self, event):        if event.button() == Qt.LeftButton:            self.dragPosition = event.globalPos() - self.frameGeometry(            ).topLeft()            QApplication.postEvent(self, QEvent(174))            event.accept()

捕捉鼠标移动事件

def mouseMoveEvent(self, event):        if event.buttons() == Qt.LeftButton:            try:                self.move(event.globalPos() - self.dragPosition)                event.accept()            except:pass

判断是否该隐藏

def hide_or_show(self, mode, event):        pos = self.frameGeometry().topLeft()        if mode == 'show' and self.moved:            if pos.x() + WINDOW_WEIGHT >= SCREEN_WEIGHT:  # 右侧显示                self.startAnimation(SCREEN_WEIGHT - WINDOW_WEIGHT + 2, pos.y())                event.accept()                self.moved = False            elif pos.x() <= 0:  # 左侧显示                self.startAnimation(0,pos.y())                event.accept()                self.moved = False            elif pos.y() <= 0: # 顶层显示                self.startAnimation(pos.x(),0)                event.accept()                self.moved = False        elif mode == 'hide':            if pos.x() + WINDOW_WEIGHT >= SCREEN_WEIGHT:  # 右侧隐藏                self.startAnimation(SCREEN_WEIGHT - 2,pos.y())                event.accept()                self.moved = True            elif pos.x() <= 2:  # 左侧隐藏                self.startAnimation(2 - WINDOW_WEIGHT,pos.y())                event.accept()                self.moved = True            elif pos.y() <= 2: # 顶层隐藏                self.startAnimation(pos.x(),2 - WINDOW_HEIGHT)                event.accept()                self.moved = True

将划入划出作为属性动画

def startAnimation(self,width,height):        animation = QPropertyAnimation(self,b"geometry",self)        startpos = self.geometry()        animation.setDuration(200)        newpos = QRect(width,height,startpos.width(),startpos.height())        animation.setEndValue(newpos)        animation.start()

完整代码

import sys,randomfrom PyQt5.QtGui import QPalette,QColorfrom PyQt5.QtWidgets import QWidget,QVBoxLayout,QPushButton,    QDesktopWidget,QApplicationfrom PyQt5.QtCore import Qt,QRect,QEvent,QPointfrom PyQt5.Qt import QCursor,QPropertyAnimationSCREEN_WEIGHT = 1920SCREEN_HEIGHT = 1080WINDOW_WEIGHT = 300WINDOW_HEIGHT = 600class Ui_Form(QWidget):    def __init__(self):        self.moved = False        super(Ui_Form,self).__init__()        self.setupUi()        self.resize(WINDOW_WEIGHT, WINDOW_HEIGHT)        self.show()    def setupUi(self):        self.setWindowFlags(Qt.FramelessWindowHint                            | Qt.WindowStaysOnTopHint                            | Qt.Tool) # 去掉标题栏        self.widget = QWidget()        self.Layout = QVBoxLayout(self.widget)        self.Layout.setContentsMargins(0,0,0,0)        self.setLayout(self.Layout)        self.setWindowFlag(Qt.Tool)        self.main_widget = QWidget()        self.Layout.addWidget(self.main_widget)        self.paint = QPushButton(self.main_widget)        self.paint.setText("改变颜色")        self.paint.move(QPoint(120,200))        self.paint.clicked.connect(self.Painting)        self.exit = QPushButton(self.main_widget)        self.exit.setText("  退出  ")        self.exit.move(QPoint(120,400))        self.exit.clicked.connect(lambda:exit(0))        self.setStyleSheet('''                QPushButton {                color: rgb(137, 221, 255);                background-color: rgb(37, 121, 255);                border-style:none;                border:1px solid #3f3f3f;                padding:5px;                min-height:20px;                border-radius:15px;            }            ''')    def Painting(self):        color = random.choice(["CCFFFF","CC6699","CC99FF","99CCFF"])        palette1 = QPalette()        palette1.setColor(self.backgroundRole(),                          QColor("#{}".format(color))) # 改变窗体颜色        self.setPalette(palette1)    def enterEvent(self, event):        self.hide_or_show('show', event)    def leaveEvent(self, event):        self.hide_or_show('hide', event)    def mousePressEvent(self, event):        if event.button() == Qt.LeftButton:            self.dragPosition = event.globalPos() - self.frameGeometry(            ).topLeft()            QApplication.postEvent(self, QEvent(174))            event.accept()    def mouseMoveEvent(self, event):        if event.buttons() == Qt.LeftButton:            try:                self.move(event.globalPos() - self.dragPosition)                event.accept()            except:pass    #def mouseReleaseEvent(self, event):        #self.moved = True        #self.hide_or_show('show', event)    def hide_or_show(self, mode, event):        pos = self.frameGeometry().topLeft()        if mode == 'show' and self.moved:            if pos.x() + WINDOW_WEIGHT >= SCREEN_WEIGHT:  # 右侧显示                self.startAnimation(SCREEN_WEIGHT - WINDOW_WEIGHT + 2, pos.y())                event.accept()                self.moved = False            elif pos.x() <= 0:  # 左侧显示                self.startAnimation(0,pos.y())                event.accept()                self.moved = False            elif pos.y() <= 0: # 顶层显示                self.startAnimation(pos.x(),0)                event.accept()                self.moved = False        elif mode == 'hide':            if pos.x() + WINDOW_WEIGHT >= SCREEN_WEIGHT:  # 右侧隐藏                self.startAnimation(SCREEN_WEIGHT - 2,pos.y())                event.accept()                self.moved = True            elif pos.x() <= 2:  # 左侧隐藏                self.startAnimation(2 - WINDOW_WEIGHT,pos.y())                event.accept()                self.moved = True            elif pos.y() <= 2: # 顶层隐藏                self.startAnimation(pos.x(),2 - WINDOW_HEIGHT)                event.accept()                self.moved = True    def startAnimation(self,width,height):        animation = QPropertyAnimation(self,b"geometry",self)        startpos = self.geometry()        animation.setDuration(200)        newpos = QRect(width,height,startpos.width(),startpos.height())        animation.setEndValue(newpos)        animation.start()if __name__ == "__main__":    app = QApplication(sys.argv)    ui = Ui_Form()    sys.exit(app.exec_())

源码获取加群哦:1136192749

bec5a978414efca172cc4db68cd37b2d.png

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

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

相关文章

query的list()和iterate()区别 面试题

query的list()和iterate()区别 1.返回的类型不一样&#xff0c;list返回List&#xff0c;iterate返回iterator 2.查询策略不同。 获取数据的方式不一样&#xff0c;list会直接查询数据库&#xff0c;iterate会先到数据库中把id取出来&#xff0c;然后真正要遍历某个对象的时候…

java+eclipse+selenium环境搭建

这几天在学selenium&#xff0c;大头虾的我。安装环境还是遇到了挺多问题&#xff0c;赶紧来记录下。不然下次又。。。&#xff08;参考虫师的《Selenium2 Java自动化测试实战》&#xff09;&#xff0c;就随便写写加深下自己的印象。 1、安装java 访问java官网下载jdk http://…

unity socket传输图片_python3实现socket传输图片

我最近在做一个项目的时候需要把树莓派上的摄像头拍摄的图片实时传输到我的PC上我想通过socket完成这个功能我找了找网上的代码&#xff0c;好多都是python2.x版本的&#xff0c;或者是图片总是传不过来的&#xff0c;只能自己写了一个我先附上我的源代码&#xff0c;再来聊一聊…

python 对象_Python中的Barrier对象

python中的Barrier对象用于等待固定数量的线程完成执行&#xff0c;然后任何特定线程才能继续执行程序。每个线程在到达Barrier时都调用wait()函数。Barrier负责跟踪wait()调用的数量。如果该数目超出了为其初始化Barrier的线程数&#xff0c;则Barrier为等待线程提供了一种继续…

AE CreateFeatureClass 创建shp. 删除shp. 向shp中添加要素

/// <summary>/// 创建多边形shp/// </summary>/// <param name"pPolygon"></param>/// <param name"shpPath"></param>public static void CreatePolygonFeatureClass(IPolygon pPolygon, string shpfolder,string …

aes密文长度_RSA加密密文可变(一句话说明)

先来看一个搜索结果&#xff1a;RSA算法本质上是基于数学【对极大整数做因数分解的难度】的原理&#xff0c;so 密文本质上是一堆有规则的数字经过编码和【填充】的结果。原文和加密密钥相同&#xff0c;在java环境&#xff0c;默认Padding模式下每次生成的密文是相同的&#x…

网络分析之networkx(转载)

图的类型 Graph类是无向图的基类&#xff0c;无向图能有自己的属性或参数&#xff0c;不包含重边&#xff0c;允许有回路&#xff0c;节点可以是任何hash的python对象&#xff0c;节点和边可以保存key/value属性对。该类的构造函数为Graph(dataNone&#xff0c;**attr)&#xf…

sqlite管理工具_Liquibase 数据库版本管理工具:1.安装

1.Liquibase 是什么粘一段官方的解释Track, version, and deploy database changes跟踪、管理和应用数据库变化说白了&#xff0c;就是一个将你的数据库脚本转化为xml格式保存起来。其中包含了你对数据库的改变&#xff0c;以及数据库的版本信息&#xff0c;方便数据的升级和回…

BZOJ2720: [Violet 5]列队春游

2720: [Violet 5]列队春游 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 173 Solved: 125[Submit][Status][Discuss]Description Input Output Sample Input Sample Output HINT 题解&#xff1a;对于这种题目我只能呵呵一笑欺负我是单身汪&#xff0c;哎&#xff01; 一、…

面向对象(二)——三大特性(封装、继承、多态)

一、封装 目的&#xff1a;保护类&#xff0c;让类更加安全。 做法&#xff1a;让类里面的成员变量变为私有&#xff08;即访问修饰符&#xff09;的&#xff0c;做相应的方法或者属性去间接的操作成员变量 ※访问修饰符 private 私有的 只能在该类中访问 protec…

伸展树的代码实现

一、伸展树的数据结构 typedef struct Node {int key; struct Node *lch,*rch,*parent; }* Node ,* Tree; 二、伸展树的基础操作 下面几个函数中&#xff0c;设x 的父节点为 p, p的父节点为g 。 zig( t , x ) 右旋。当p是根节点&#xff0c;x是p的左孩子&#xff0c;将…

枚举命名规范_UE4 C++基础教程 - 编码规范

为什么要学习编码规范&#xff1f;良好的编码规范不仅利于项目维护&#xff0c;也增加了代码辨识度。使我们在阅读代码时能够更加清晰的理解代码意图。维护编码规范不是一件机械化的工作&#xff0c;它更像是一门艺术&#xff0c;让我们在有限的规范内发挥自己的创造力。除此之…

Cocos2d-x之Log输出机制

| 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 在cocos2d-x中&#xff0c;我们使用log这个函数进行输出&#xff0c;log可以输出很多参数&#xff0c;它的使用方式就和使用c语言中的printf的使用方式差不多。log其实是一个跨平台的日志输出的…

python接口测试jason_Python 接口测试之Json数据文件操作

引言 前面说过接口测试就是数据的测试&#xff0c;在测试之前&#xff0c;需要准备好测试数据&#xff0c;而测试数据可以用数据库、excel、txt和csv方式&#xff0c;当然还有一种方式&#xff0c;那就是使用json文件来储存测试数据。常用的方式就是这些。 设计思路 python读取…

城市轮廓线求解

问题描述 每一个建筑物用一个三元组表示(L, H, R), 表示左边界, 高度和右边界,轮廓线用X,Y,X,Y…这样的交替式表示,给N个建筑&#xff0c;求轮廓线。 总体思路 首先&#xff0c;要将建筑物离散成点或线&#xff0c;方便运算。将建筑物表示成&#xff08;L,H&#xff09;,(R,…

wpf的listbox循环数据滚动_滚动版 CentOS Stream 和 Fedora 的关系

如果 CentOS 现在位于 RHEL 的上游&#xff0c;那么 Fedora 会发生什么&#xff1f;那不是 Fedora 在 Red Hat 生态系统中的角色吗&#xff1f;-- Matthew Miller&#xff08;作者&#xff09;一封来自 Fedora 项目负责人办公室的信件&#xff1a;&#xff08;LCTT 译注&#x…

求无序序列每个元素最接近的值

1、问题描述 给一个n个元素的线性表A&#xff0c;对于每个数Ai&#xff0c;找到它之前的数中&#xff0c;和它最接近的数。 即对于每个i&#xff0c;求 Ci min{ |Ai -Aj | | 1< j < i} 1.2算法分析 有两种思路可以解决上诉问题&#xff1a; &#xff08;1&#xff0…

maven引入springframework的猫腻

看官网的quickstart&#xff0c;以为maven只要将quickstart里的配置复制到项目里就好了&#xff0c;但是在项目中使用jdbc和事物时&#xff0c;都提示找不到相关的类&#xff0c;才知道原来官网文档还有猫腻。 maven引入spring框架 project下框架有点多&#xff0c;点spring …

bigdecimal 小于等于0_半场0-0比分的比赛,你需要注意这些

大家好&#xff0c;我是师弟&#xff0c;今天给大家带来有关于半场0-0比赛的分析。前段时间有朋友向我吐槽道&#xff1a;“最近买半场0-0的比赛输惨了”&#xff0c;经过询问了解到他是专挑半场0-0的比赛在中场的时候买入大1.5&#xff0c;没想到输多赢少。而他的想法可能也代…

将chart放入panel中出现滚动条_聊天场景在web前端开发中的体验与优化

在日常工作中&#xff0c;如下图的聊天场景是不是很熟悉&#xff0c;没错就是我们再熟悉不过的 QQ 和微信&#xff0c;一个正常的聊天界面大致上是长这个样子的&#xff1a;这种聊天窗口的消息流有两个明显的特点&#xff1a;最新的消息和滚动条初始位置需要在列表的最底部下拉…