PyQt自定义标题栏(界面美化,附C++和Python源码)
文章目录
- 1. 简述
- 2.代码说明
- (1)主窗口
- (2)标题栏
- (3)完整代码
- (4)美化(QSS)
- 3.源代码链接
1. 简述
这几天给老师做项目用到了PyQt5,说一些自己的想法,用python写qt界面我觉得如果懂C++和Qt是最好的,因为PyQt5没有相应的官方文档,我做项目时都是对照着Qt的C++文档做的,而且二者基本差别不大,只是一些小细节有略微不同而已,当然不懂Qt直接做也可以,但是这难免很费劲。
废话就说这些,下面就稍微说下Qt界面美化,后面附有C++和python的代码链接,下面是效果图:
2.代码说明
做这个自定义的标题栏,主要实现以下几个功能:
- 关闭,最小化,复原三个按钮的基本功能;
- 双击标题栏窗口最大化或者缩小;
- 鼠标点击拖动窗口;
- 显示标题和图标
(1)主窗口
先说一下主界面的代码,主要就是两行:
self.setWindowFlags(Qt.FramelessWindowHint) #隐藏主窗口边界self.lay.setSpacing(0); #去除控件间的距离self.lay.setContentsMargins(0, 0, 0, 0)
这里的self就是主窗口QMainWindow,lay就是一个QVBoxLayout的布局,使用参数Qt.FramelessWindowHint可以让主窗口不现实边框,只显示客户区,我们就可以自己绘制标题栏的内容。
下面两行设为0是为了取消控件之间的间距,不这样的话很难设置空间的布局,会使得窗口很丑。
主窗口还有一个就是SetStyleSheet就是设置界面的样式,这个后面再说。
(2)标题栏
标题栏主要包含五个空间两个label:图标label、标题label,三个按钮:最小化按钮、复原按钮和关闭按钮。三个按钮分别通过connect链接下面几个槽即可。另外代码中的self.win是主窗口的引用,如果使用self.window()获取的有些时候无法准确的获取到对应的值而使得功能失效,我这里选择用一个变量保存来进行操作,当然也可以通过另外两种方式:
- 通过信号槽将鼠标事件发送出去
- 通过实践过滤器eventFliter在主窗口中为标题栏Widget安装事件进一步处理。
我这里有个小问题,因为self.win是用来存放主界面的,因此标题栏窗口不能独立的存在,如果强行将主窗口设为None创建的话,窗口能显示但是最大化等功能不能执行,这个可以自行修改,这到不难,判断下win是否为None,是的话对本窗口操作即可。
#最小化窗口def ShowMininizedWindow(self):self.win.showMinimized()#最大化窗口def ShowMaximizedWindow(self):self.win.showMaximized()#复原窗口def ShowRestoreWindow(self):if self.win.isMaximized():self.win.showNormal()else:self.win.showMaximized()#关闭窗口def CloseWindow(self):self.win.close()
事件触发,鼠标单击、双击和移动的事件。
def mouseDoubleClickEvent(self, event):self.ShowRestoreWindow()return QWidget().mouseDoubleClickEvent(event)def mousePressEvent(self, event):self.isPressed = Trueself.startPos = event.globalPos() #记录鼠标点击的位置return QWidget().mousePressEvent(event)def mouseReleaseEvent(self, event):self.isPressed = Falsereturn QWidget().mouseReleaseEvent(event)def mouseMoveEvent(self, event):if self.isPressed:if self.win.isMaximized:self.win.showNormal()#计算窗口应该移动的距离movePos = event.globalPos() - self.startPosself.startPos = event.globalPos()self.win.move(self.win.pos() + movePos)return QWidget().mouseMoveEvent(event)
(3)完整代码
代码中的图标,等一下参数是我自己定义的,可以在最后的源代码中查看。
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from default import *class TitleBar(QWidget):def __init__(self, parent):super(TitleBar, self).__init__()self.win = parentself.InitializeWindow()def InitializeWindow(self):self.isPressed = Falseself.setFixedHeight(TITLE_BAR_HEIGHT)self.InitializeViews()passdef InitializeViews(self):self.iconLabel = QLabel(self)self.titleLabel = QLabel(self)self.minButton = QPushButton(self)self.restoreButton = QPushButton(self)self.closeButton = QPushButton(self)self.minButton.setFixedSize(TITLE_BUTTON_SIZE, TITLE_BUTTON_SIZE);self.restoreButton.setFixedSize(TITLE_BUTTON_SIZE, TITLE_BUTTON_SIZE);self.closeButton.setFixedSize(TITLE_BUTTON_SIZE, TITLE_BUTTON_SIZE);self.iconLabel.setFixedSize(TITLE_LABEL_SIZE, TITLE_LABEL_SIZE);self.titleLabel.setFixedHeight(TITLE_LABEL_SIZE);self.iconLabel.setAlignment(Qt.AlignCenter);self.titleLabel.setAlignment(Qt.AlignCenter);self.minButton.setIcon(QIcon(TITLE_MIN_ICON));self.restoreButton.setIcon(QIcon(TITLE_RESTORE_ICON));self.closeButton.setIcon(QIcon(TITLE_CLS_ICON));self.minButton.clicked.connect(self.ShowMininizedWindow)self.restoreButton.clicked.connect(self.ShowRestoreWindow)self.closeButton.clicked.connect(self.CloseWindow)self.lay = QHBoxLayout(self)self.setLayout(self.lay)self.lay.setSpacing(0)self.lay.setContentsMargins(0, 0, 0, 0)self.lay.addWidget(self.iconLabel)self.lay.addWidget(self.titleLabel)self.lay.addWidget(self.minButton)self.lay.addWidget(self.restoreButton)self.lay.addWidget(self.closeButton)def ShowMininizedWindow(self):self.win.showMinimized()def ShowMaximizedWindow(self):self.window.showMaximized()def ShowRestoreWindow(self):if self.win.isMaximized():self.win.showNormal()else:self.win.showMaximized()def CloseWindow(self):self.win.close()def SetTitle(self, str):self.titleLabel.setText(str)def SetIcon(self, pix):self.iconLabel.setPixmap(pix.scaled(self.iconLabel.size() - QSize(TITLE_ICON_MAG, TITLE_ICON_MAG)))def mouseDoubleClickEvent(self, event):self.ShowRestoreWindow()return QWidget().mouseDoubleClickEvent(event)def mousePressEvent(self, event):self.isPressed = Trueself.startPos = event.globalPos()return QWidget().mousePressEvent(event)def mouseReleaseEvent(self, event):self.isPressed = Falsereturn QWidget().mouseReleaseEvent(event)def mouseMoveEvent(self, event):if self.isPressed:if self.win.isMaximized:self.win.showNormal()movePos = event.globalPos() - self.startPosself.startPos = event.globalPos()self.win.move(self.win.pos() + movePos)return QWidget().mouseMoveEvent(event)if __name__ == '__main__':app = QApplication(sys.argv)win = TitleBar(None)win.show()sys.exit(app.exec_())pass
(4)美化(QSS)
Qss是Qt的界面样式,直接挪用Qt的就可以,官方参考地址:QSS Help
颜色是从Visual Studio中取的。
QWidget
{background-color:#313034;color:#f1f1f1;font-size:12px;border:2px solid #423f48;font: "Tlwg Typo";margin:0px;}QMainWindow
{
}QPushButton
{border:none;width:35px;
}QPushButton:hover
{background-color:#423f48;
}QPushButton:pressed
{background-color:#444444;
}QLabel
{background-color:#2A292B;border:none;
}
3.源代码链接
里面有C++的和Python的代码,C++的使用Visual Studio+Qt写的。
源代码链接
PyQt自定义标题栏(界面美化,附C++和Python源码)相关推荐
- 最新ChatGPT GPT-4 NLU应用之实体分类识别与模型微调(附ipynb与python源码及视频)——开源DataWhale发布入门ChatGPT技术新手从0到1必备使用指南手册(六)
目录 前言 最新ChatGPT GPT-4 自然语言理解NLU实战之实体分类识别与模型微调 主题分类 精准分类解决手段 模型微调步骤 核心代码 其它NLU应用及实战 相关文献 参考资料 其它资料下载 ...
- 毕业设计-基于BIT的双时相遥感影像变化检测(附下载链接-Python源码+毕业论文+答辩PPT+相关资料等等)
毕业设计-基于BIT的双时相遥感影像变化检测(Python开发) 点我下载文件 论文目录 压缩包目录 毕业设计 内容摘要(主要应解决的问题.难点): 掌握国土资源利用率和土地覆盖类型,是地理国情普查与 ...
- 耗时一周时间,我构建了基于知识图谱的医生推荐系统(附完整版 Python 源码)
大家好,今天给大家分享一个项目,主要实现了疾病自诊和医生推荐两个功能并构建了医生服务指标评价体系.疾病自诊主要通过利用 BERT+CRF+BiLSTM 的医疗实体识别, 建立医学知识图谱, 从而实现基 ...
- 最新ChatGPT GPT-4 相似匹配Embedding技术详解(附ipynb与python源码及视频讲解)——开源DataWhale发布入门ChatGPT技术新手从0到1必备使用指南手册(一)
目录 前言 最新ChatGPT GPT-4 相似匹配Embedding技术详解 1. 何为Embedding 2. 相关API 2.1 LMAS Embedding API 2.2 ChatGPT S ...
- 最新ChatGPT GPT-4 文本推理技术详解(附ipynb与python源码及视频讲解)——开源DataWhale发布入门ChatGPT技术新手从0到1必备使用指南手册(二)
目录 前言 最新ChatGPT GPT-4 文本推理技术详解 1. 什么是推理(Reasoning)? 2. 导入ChatGPT 3. 测试ChatGPT的推理能力 3.1 演绎推理(Deductiv ...
- 最新ChatGPT GPT-4 NLU实战之文档问答类ChatPDF功能(附ipynb与python源码及视频)——开源DataWhale发布入门ChatGPT技术新手从0到1必备使用指南手册(五)
目录 前言 最新ChatGPT GPT-4 自然语言理解NLU实战之文档问答类ChatPDF功能 引言 ChatGPT 接口 Qdrant数据库Embedding存储 核心代码 测试 其它NLU应用及 ...
- DIY背景美化生成器微信小程序源码
这是一款DIY美化器小程序 支持上传自定义图片作为背景 内容支持DIY输入,支持上传识别读取 总得来说还是不错的,好了下面大家可以来看看小编的测试演示图: 小程序源码下载地址:(已更新)二维码DIY背 ...
- 【功能超全】基于OpenCV车牌识别停车场管理系统软件开发【含python源码+PyqtUI界面+功能详解】-车牌识别python 深度学习实战项目
车牌识别基础功能演示 摘要:车牌识别系统(Vehicle License Plate Recognition,VLPR) 是指能够检测到受监控路面的车辆并自动提取车辆牌照信息(含汉字字符.英文字母.阿 ...
- 活体检测眨眼、张嘴、点头、摇头动作一网打尽:人脸面部活体检测系统【含Python源码+PyqtUI界面+原理详解】
基本功能演示 摘要:活体检测是用于判断捕捉到的人脸是真实人脸,还是伪造的人脸攻击的一种技术手段.本文详细介绍了其实现的技术原理,同时给出完整的Python实现代码,并且通过PyQT实现了UI界面,更方 ...
最新文章
- 《css世界》的那些实用技巧
- html的学习小结(3):HTML 4.0 事件属性
- VTK修炼之道21:图像基本操作_彩色图像生成灰度图像
- svn在linux下的使用(转)
- Java接口的几种常见用法
- Spring Boot文档阅读笔记-@SpringBootApplication官方解析与实例(1.5.19)
- java中使用rmi进行远程方法调用
- Linux用户登录日志查询
- [论文笔记]MACHINE COMPREHENSION USING MATCH-LSTM AND ANSWER POINTER
- ubuntu安装使用latex和texmaker--PC端
- cameraLink
- Qt FTP文件上传下载简单例子
- (干货)备战2021年软考中级网络工程师-03-计算机系统开发基础
- Blockstack: A Global Naming and Storage System Secured by Blockchains
- c语言中判断星期几的程序,用C语言编程:输入某年某月某日,判断这一天是这一年的第几个星期中的星期几...
- linux wchan含义,有关linux平台的ps命令
- 集成运放虚短,虚断,虚地
- Farmer John的故事
- c语言编程题改错题怎么改,c语言编程改错题.doc
- VTK:数据动画用法实战
热门文章
- HDU 4284 Travel(12年天津 状态DP)
- amazon sqs java_使用java的Amazon sns和sqs消息
- Servlet API 详解(HttpServlet、HttpServletRequest、HttpServletResponse)
- gradle引用本地aar的方法
- 【SSL】2291分组背包
- 3天学会Vue之基本知识(第三天:单文件组件(vue-cli)):结合项目开发经验,总结最关键的内容
- 一个建议:多玩一玩RPC
- 重装系统计算机无法启动,教你电脑无法开机如何重装系统
- 对web.config进行加密
- EnterPrise Architect(EA)使用教程(六)部署图