Qt第二十六章:QWidget、QMainWindow自定义标题栏

news2024/11/18 6:38:00
  1. 工具类(读者直接复制到项目中)
    class QCustomTitleBar:
        def __init__(self, window: QtWidgets):
            self.window = window
            # 默认标题栏高度 必须设
            self.DEFAULT_TITILE_BAR_HEIGHT = 40
            # 存储父类的双击事件
            self.mouseDoubleClickEvent_parent = self.window.mouseDoubleClickEvent
            # 将本类的双击事件赋值给将父类的双击事件
            self.window.mouseDoubleClickEvent = self.mouseDoubleClickEvent
    
            # 存储父类的窗口大小改变事件
            self.resizeEvent_parent = self.window.resizeEvent
            # 将本类的窗口大小改变事件赋值给将父类的窗口大小改变事件
            self.window.resizeEvent = self.resizeEvent
    
            # 设置ui文件里main_layout上边距,以免遮挡标题栏
            self.window.setContentsMargins(0, self.DEFAULT_TITILE_BAR_HEIGHT, 0, 0)
    
            # 1.设置无边框 和 透明背景 无边框必须设置全,不然会导致点击任务栏不能最小化窗口
            self.window.setWindowFlags(
                Qt.Window
                | Qt.FramelessWindowHint
                | Qt.WindowSystemMenuHint
                | Qt.WindowMinimizeButtonHint
                | Qt.WindowMaximizeButtonHint
            )
            # self.window.setAttribute(Qt.WA_TranslucentBackground)
            # 2.添加自定义的标题栏到最顶部
            self.title = QLabel("标题文字", self.window)
            # 3.设置标题栏样式
            self.setStyle()
            # 4.添加按钮
            # 添加关闭按钮
            self.close_btn = QPushButton("", self.window)
            self.close_btn.setGeometry(self.window.width() - 33, 10, 20, 20)
            # 添加最大化按钮
            self.max_btn = QPushButton("", self.window)
            self.max_btn.setGeometry(self.window.width() - 66, 10, 20, 20)
            # 添加最小化按钮
            self.min_btn = QPushButton("", self.window)
            self.min_btn.setGeometry(self.window.width() - 99, 10, 20, 20)
            # 设置三个按钮的鼠标样式
            self.close_btn.setCursor(Qt.PointingHandCursor)
            self.max_btn.setCursor(Qt.PointingHandCursor)
            self.min_btn.setCursor(Qt.PointingHandCursor)
            # 设置三个按钮的样式
            self.close_btn.setStyleSheet(
                "QPushButton{border-image:url('./images/close.png');background:#ff625f;border-radius:10px;}"
                "QPushButton:hover{background:#eb4845;}"
            )
            self.max_btn.setStyleSheet(
                "QPushButton{border-image:url('./images/max.png');background:#ffbe2f;border-radius:10px;}"
                "QPushButton:hover{background:#ecae27;}"
            )
            self.min_btn.setStyleSheet(
                "QPushButton{border-image:url('./images/min.png');background:#29c941;border-radius:10px;}"
                "QPushButton:hover{background:#1ac033;}"
            )
    
            # 5.添加工具栏按钮事件
            # 关闭按钮点击绑定窗口关闭事件
            self.close_btn.pressed.connect(self.window.close)
            # 最大化按钮绑定窗口最大化事件
            self.max_btn.pressed.connect(self.setMaxEvent)
            # 最小化按钮绑定窗口最小化事件
            self.min_btn.pressed.connect(self.window.showMinimized)
            # 6.记录全屏窗口的大小-ps非常有用
            self.window_max_size = None
            # 7.设置标题栏鼠标跟踪 鼠标移入触发,不设置,移入标题栏不触发
            self.title.setMouseTracking(True)
    
        def setMaxEvent(self, flag=False):
            """
            @description  最大化按钮绑定窗口最大化事件和事件 拿出来是因为拖动标题栏时需要恢复界面大小
            @param flag 是否是拖动标题栏 bool
            @return
            """
            if flag:
                if self.window.isMaximized():
                    self.window.showNormal()
                    self.max_btn.setStyleSheet(
                        "QPushButton{border-image:url('./images/max.png');background:#ffbe2f;border-radius:10px;}"
                        "QPushButton:hover{background:#ecae27;}"
                    )
                    return self.window_max_size
                return None
            else:
                if self.window.isMaximized():
                    self.window.showNormal()
                    self.max_btn.setStyleSheet(
                        "QPushButton{border-image:url('./images/max.png');background:#ffbe2f;border-radius:10px;}"
                        "QPushButton:hover{background:#ecae27;}"
                    )
                else:
                    self.window.showMaximized()
                    self.max_btn.setStyleSheet(
                        "QPushButton{border-image:url('./images/restore.png');background:#ffbe2f;border-radius:10px;}"
                        "QPushButton:hover{background:#ecae27;}"
                    )
                    # 记录最大化窗口的大小  用于返回最大化时拖动窗口恢复前的大小 这个程序循环帧会取不到恢复前的宽度
                    self.window_max_size = QSize(self.window.width(), self.window.height())
    
        def setStyle(self, style: str = ""):
            """
            @description 设置自定义标题栏样式
            @param
            @return
            """
            # 想要边框 加上border:1px solid #cccccc;
            DEFAULT_STYLE = """
                                background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,stop:0 #fafafa,stop:1 #d1d1d1);
                                color:#333333;padding:10px;border:1px solid #c6c6c6;
                                border-top-left-radius:4px;
                                border-top-right-radius:4px;
                            """
            self.title.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)
            # 设置样式
            self.title.setStyleSheet(DEFAULT_STYLE if not style else DEFAULT_STYLE + style)
            # 设置大小
            self.title.setGeometry(0, 0, self.window.width(), self.DEFAULT_TITILE_BAR_HEIGHT)
    
        def mouseDoubleClickEvent(self, a0: QtGui.QMouseEvent) -> None:
            """
            @description 鼠标双击事件
            @param
            @return
            """
            # 如果双击的是鼠标左键 且在标题栏范围内 则放大缩小窗口
            if a0.button() == Qt.MouseButton.LeftButton and a0.position().y() < self.title.height():
                self.setMaxEvent()
            return self.mouseDoubleClickEvent_parent(a0)
    
        def resizeEvent(self, a0: QtGui.QResizeEvent) -> None:
            """
            @description  窗口缩放事件
            @param
            @return
            """
            # 最大化最小化的时候,需要去改变按钮组位置
            self.close_btn.move(self.window.width() - 33, 10)
            self.max_btn.move(self.window.width() - 66, 10)
            self.min_btn.move(self.window.width() - 99, 10)
            self.title.resize(self.window.width(), self.DEFAULT_TITILE_BAR_HEIGHT)
            return self.resizeEvent_parent(a0)
    
  2. 使用
  3. 使用注意:UI一定要使用自适应布局,否则自定义标题栏会遮挡页面头部。
  4. 如果还需要拖动和缩放窗口:只需要将继承的QWidget换成QWindowMoveResize即可
    QWindowMoveResize参考:Qt第二十五章:QWidget隐藏标题栏后-缩放移动窗口_苍穹之跃的博客-CSDN博客
    Qt第二十四章:QMainWindow隐藏标题栏后如何移动窗口(右下角可以缩放)_苍穹之跃的博客-CSDN博客

 

 

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

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

相关文章

【数学】旋转后仍为函数图像问题

∣旋转后仍为函数图像问题NightguardSeries.∣\begin{vmatrix}\huge{\textsf{ 旋转后仍为函数图像问题 }}\\\texttt{ Nightguard Series. }\end{vmatrix}∣∣∣∣∣​ 旋转后仍为函数图像问题 Nightguard Series. ​∣∣∣∣∣​ ♣例1\clubsuit \textsf{例1}♣例1 f(x)ln⁡(x…

经典bloom算法(**布隆过滤器**)-levelDB拆分

bloom算法(布隆过滤器) 原理 先说一下什么是布隆过滤器&#xff0c;Bloom Filter是1970年由布隆提出的&#xff0c;它实际上是一个很长的二进制向量&#xff0c;和一系列随机值映射的函数&#xff0c;主要用于判断一个元素是否在一个集合中。 通常判断一个元素是否在一个集合…

Hasse diagram

In order theory, a Hasse diagram (/ˈhsə/; German: [ˈhasə]) is a type of mathematical diagram used to represent a finite partially ordered set, in the form of a drawing of its transitive reduction. Concretely, for a partially ordered set (S, ≤) one rep…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校学生宿舍管理信息系统3x4rz

做毕业设计一定要选好题目。毕设想简单&#xff0c;其实很简单。这里给几点建议&#xff1a; 1&#xff1a;首先&#xff0c;学会收集整理&#xff0c;年年专业都一样&#xff0c;岁岁毕业人不同。很多人在做毕业设计的时候&#xff0c;都犯了一个错误&#xff0c;那就是不借鉴…

記錄下用google colab 进行GPU(TPU)训练

文章目录温馨提示打开网站上传资源下载资源到google colab温馨提示 需要科学上网&#xff0c;没有的话可以点这个 https://shandianpro.com/#/register?codewCXwkCOU下个clashx进行 挂载 https://download.csdn.net/download/monk96/87231589 配置自行百度 打开网站 google…

Win11系统提示backgroundtaskhost.exe系统错误解决方法

Win11系统提示backgroundtaskhost.exe系统错误解决方法分享。backgroundTaskHost.exe是与Microsoft Cortana的虚拟助手相关联的关键系统进程。近期有Win11用户在电脑的使用中遇到了系统提示“backgroundTaskHost.exe – ApplicATIon Error”的错误&#xff0c;今天我们一起来看…

[附源码]计算机毕业设计JAVA学生考试成绩分析系统

[附源码]计算机毕业设计JAVA学生考试成绩分析系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

疫情可视化part3

前言 之前在part2中说的添加自定义主题配色已经开发完成了&#xff0c;除此之外我还添加了一些的3d特效。 前期文章 这是part1的文章&#xff1a;https://blog.csdn.net/xi1213/article/details/126824752这是part2的文章&#xff1a;https://blog.csdn.net/xi1213/article/…

[附源码]Python计算机毕业设计Django基于VUE的网上订餐系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【Linux】进程

1.linux操作系统要不要管理进程呢&#xff1f;必须要&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 2.linux是如何管理大量进程的呢&#xff1f;先组织&#xff0c;再描述。 1.什么是进程 进程就是系统运行中…

WordPress批量修改数据库内文章内容文字关键字标题

WordPress网站内容标题文字一键修改&#xff0c;注意到了网站上很多要一个个的修改&#xff0c;那工作了巨大&#xff0c;怎么快速在数据库中用SQL命令批量替换呢&#xff1f; 通过数据库替换方法 1.进入宝塔面板-数据库-选择对应的数据库-管理数据库-登录进来。就可以直接对数…

2022年小美赛“认证杯”数学建模ABCD题初步分析选题建议

​ 2022年小美赛数学建模赛题已经发布&#xff1a; A题 翼龙是如何飞行的 B题 序列的遗传过程 C题 对人类活动进行分类 D题 是否应长期禁止野生动物贸易 总体来说&#xff0c;从赛题难度来看B>A>C>D&#xff0c;其中CD属于ICM交叉学科类赛题&#xff0c;难度系数相对…

腾讯云原生安全“3+1”一体化方案发布,重构云上安全防御体系

12月1日&#xff0c;2022腾讯全球数字生态大会上&#xff0c;以“安全守护&#xff0c;行稳致远”为主题的「云原生安全专场」顺利召开&#xff0c;论坛深入讨论了云原生安全的行业发展趋势、技术探索、产品创新和落地实践。 会上&#xff0c;腾讯安全发布了云原生安全“31”一…

java面向对象-----再谈方法

目录 方法的重载(overload) 可变个数的形参 方法参数的值传递机制 基本数据类型的参数传递 引用数据类型的参数传递 递归(recursion)方法 总结 方法的重载(overload) 重载的概念 &#xff1a;在同一个类中&#xff0c;允许存在一个以上的同名方法&#xff0c;只要它们的参…

基于粒子群优化的神经网络PID控制(Matlab)代码实现

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

“空间代谢组学“用于食管鳞状细胞癌早期筛查的研究

​ 代谢组学文献分享—研究背景 近几年代谢组学的研究如火如荼的开展&#xff0c;极大地促进了各学科的发展&#xff0c;如疾病诊断与治疗、营养学、环境毒理学、进化和发育及药物等&#xff1b;与此同时&#xff0c;质谱成像技术&#xff08;mass spectrometry imaging, MSI…

动态规划思想

1.动态规划思想&#xff1a;因为计算量太大而提出的解放方式。将一件大的事情分成若干个小的事情。2.找一个最优的隐藏序列&#xff0c;结合动态规划思想&#xff0c;可以把这个隐藏序列分成多个时间步&#xff0c;如果每个时间步都是最优的&#xff0c;那么最终的这个序列就是…

软件测试流程分享

工作以来&#xff0c;大大小小参与的项目也有十几个了&#xff0c;涵盖财务类、保险类、OA办公类软件&#xff0c;从测试流程上看&#xff0c;基本也都大同小异&#xff0c;这里将常见的测试流程做一些梳理&#xff0c;供刚入行的朋友学习参考&#xff0c;也欢迎大家完善补充。…

GD32F30x系列ADC源码,对初学者参考价值巨大,(非常详细篇)万字源码

GD32F30x系列ADC源码【1】adc_reg.h [参考]【2】ctrl_adc.h [重点]【3】gd32f30x_dma_reg.h [参考]【4】mon_adc.h [参考 1]【5】rcu.h [参考]【6】ctrl_adc.c [重要]【7】mon_adc.c [参考1]【8】main.c [参考2]这篇文章必须配合这个连接文件一起看&#xff0c;即ADC手册 嵌入式…

我的学校网页期末作业(纯html+css实现)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…