C++ qt标题栏组件绘制
本博文源于笔者在学习C++ qt制作的标题栏组件,主要包含了,最小化,最大化,关闭。读者在看到这篇博文的时候,可以直接查看如何使用的,会使用了,然后进行复制粘贴源码部分即可。
问题来源
想要制作一个qt标题栏组件
源码
一个.h文件
#ifndef CTITLEBAR_H
#define CTITLEBAR_H#include<QWidget>
#include<QPushButton>
#include<QLabel>
#include<QHBoxLayout>class CTitleBar :public QWidget {Q_OBJECT;
public:CTitleBar(QWidget *parent,QString title,bool showMinimizeButton = true,bool showMaximizeButton = true);void setTitle(const QString& title);void mousePressEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent* event);void mouseReleaseEvent(QMouseEvent* event);
signals:void minimizeClicked();void maximizeClicked();void closeClicked();
private:QLabel* m_titleLabel;QPoint dragPosition;bool dragging;private slots:void onMinimizeClicked();void onMaximizeClicked();void onCloseClicked();
};#endif
#include "CTitleBar.h"
#include<QHBoxLayout>
#include<QApplication>
#include <QMouseEvent>
CTitleBar::CTitleBar(QWidget *parent, QString title,bool showMinimizeButton, bool showMaximizeButton) :QWidget(parent) {QHBoxLayout* layout = new QHBoxLayout(this);layout->setContentsMargins(1, 0, 0, 0);layout->setSpacing(0);QString strSkinDir = QApplication::applicationDirPath() + "/skin/images/"; //添加资源图片QLabel* iconLabel = new QLabel(this);iconLabel->setPixmap(QIcon(strSkinDir + "/logo.png").pixmap(60, 60)); // 设置图标大小iconLabel->setFixedSize(20, 30);// 标题标签m_titleLabel = new QLabel(title, this);m_titleLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);m_titleLabel->setContentsMargins(0, 0, 0, 0);layout->addWidget(iconLabel);layout->addWidget(m_titleLabel);QPushButton* minimizeButton = nullptr;QPushButton* maximizeButton = nullptr;if (showMinimizeButton) {minimizeButton = new QPushButton(this);minimizeButton->setIcon(QIcon(strSkinDir + "/min.png"));minimizeButton->setObjectName("minButton");minimizeButton->setStyleSheet("QPushButton:hover{background-color:rgb(184,184,184)}");connect(minimizeButton, &QPushButton::clicked, this, &CTitleBar::onMinimizeClicked);layout->addWidget(minimizeButton);}if (showMaximizeButton) {maximizeButton = new QPushButton(this);maximizeButton->setIcon(QIcon(strSkinDir + "/max.png"));maximizeButton->setObjectName("maxButton");maximizeButton->setStyleSheet("QPushButton:hover{background-color:rgb(184,184,184)}");connect(maximizeButton, &QPushButton::clicked, this, &CTitleBar::onMaximizeClicked);layout->addWidget(maximizeButton);}QPushButton* closeButton = new QPushButton( this);closeButton->setIcon(QIcon(strSkinDir + "/close.png"));closeButton->setObjectName("closeButton");closeButton->setStyleSheet("QPushButton:hover{background-color:rgb(232,17,35)}");connect(closeButton, &QPushButton::clicked, this, &CTitleBar::onCloseClicked);layout->addWidget(closeButton);this->setLayout(layout);this->setFixedHeight(30); // 设置标题栏高度
}void CTitleBar::setTitle(const QString& title) {m_titleLabel->setText(title);
}void CTitleBar::mousePressEvent(QMouseEvent * event)
{if (event->button() == Qt::LeftButton) {dragging = true;dragPosition = event->pos();event->accept();}}void CTitleBar::mouseMoveEvent(QMouseEvent * event)
{if (dragging && (event->buttons() & Qt::LeftButton)) {parentWidget()->move(event->globalPos() - mapToParent(dragPosition));event->accept();}
}
void CTitleBar::mouseReleaseEvent(QMouseEvent * event)
{dragging = false;
}void CTitleBar::onMinimizeClicked() {emit minimizeClicked();
}void CTitleBar::onMaximizeClicked() {emit maximizeClicked();
}void CTitleBar::onCloseClicked() {emit closeClicked();
}
如何使用
创建一个垂直栏,将标题栏包起来就行。
#ifndef CDIALOG_H
#define CDIALOG_H#include <QDialog>
#include "CTitleBar.h"class CDialog : public QDialog {Q_OBJECT
public:explicit CDialog(QString title, QWidget *parent = nullptr,bool showmin = false,bool showmax = false, int width = 400, int height = 400);virtual ~CDialog();void setSubDialog(QLayout* subLayout); protected:void initUI(QString title,int width,int height,bool showmin,bool showmax);private:CTitleBar* m_titleBar;QVBoxLayout* m_layout; QLayout* m_subLayout;
};#endif // CDIALOG_H
#include "CDialog.h"
#include <QVBoxLayout>CDialog::CDialog(QString title, QWidget *parent ,bool showmin, bool showmax, int width, int height) : QDialog(parent), m_subLayout(nullptr) {setWindowFlags(windowFlags() | Qt::FramelessWindowHint);initUI(title,width,height,showmin,showmax);
}CDialog::~CDialog() {
}void CDialog::initUI(QString title,int width,int height, bool showmin, bool showmax) {m_titleBar = new CTitleBar(this,title, showmin, showmax);connect(m_titleBar, &CTitleBar::closeClicked, this, &CDialog::close);m_layout = new QVBoxLayout(this);m_layout->addWidget(m_titleBar,0,Qt::AlignTop);m_layout->setContentsMargins(0, 0, 0, 0);m_layout->setSpacing(0);if (m_subLayout) {m_layout->addLayout(m_subLayout);}setLayout(m_layout);this->resize(width,height);setStyleSheet("QDialog{background-color:white}");m_titleBar->setStyleSheet("background-color:rgb(240,240,240)");
}void CDialog::setSubDialog(QLayout* subLayout) {if (subLayout != nullptr && m_layout != nullptr) {m_subLayout = subLayout;m_layout->addLayout(m_subLayout);}
}
当你继承了这个CDialog的时候,就会直接出现一个标题栏和一个窗体了。

相关文章:
C++ qt标题栏组件绘制
本博文源于笔者在学习C qt制作的标题栏组件,主要包含了,最小化,最大化,关闭。读者在看到这篇博文的时候,可以直接查看如何使用的,会使用了,然后进行复制粘贴源码部分即可。 问题来源 想要制作…...
Mysql运维篇(三) MySQL备份与恢复
一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。如有侵权,请留言,我及时删除! 一、物理备份与逻辑备份 1、物理备份:备份数据文件,转储数据库物理文件到某…...
数字图像处理(实践篇)二十七 Python-OpenCV 滑动条的使用
目录 1 涉及的函数 2 实践 1 涉及的函数 ⒈ setWindowProperty()用于设置GUI应用程序的属性 cv2.setWindowProperty(windowsName, prop_id, prop_value) 参数: ①...
拷贝构造函数的理解
1.拷贝构造函数与构造函数类似,当没有自定义拷贝构造函数的时候,编译器会定义一个拷贝构造函数。 当类对象没有初始化的时候,通过赋值运算符的形式,也是调用拷贝构造函数。 Test aa(100); Test bb aa;//调用拷贝构造函数Test …...
基于ncurse的floppy_bird小游戏
1. 需求分析 将运动分解为鸟的垂直运动和杆的左右运动。 2. 概要设计 2.1 鸟运动部分 2.2 杆的运动 3. 代码实现 #include <stdio.h> #include <ncurses.h>#include <stdlib.h> #include <time.h>int vx 0; int vy 1;int bird_r; int bird_c;int…...
创建第一个 Spring 项目(IDEA社区版)
文章目录 创建 Spring 项目创建一个普通的 Maven 项目添加 Spring 依赖IDEA更换国内源 运行第一个 Spring 项目新建启动类存储 Bean 对象将Bean注册到Spring 获取并使用 Bean 对象 创建 Spring 项目 创建一个普通的 Maven 项目 首先创建一个普通的 Maven 项目 添加 Spring 依…...
VUE3动漫影视视频网站模板源码
文章目录 1.视频设计来源1.1 主界面1.2 动漫、电视剧、电影视频界面1.3 播放视频界面1.4 娱乐前线新闻界面1.5 关于我们界面 2.效果和源码2.1 动态效果2.2 源码结构 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/deta…...
Node.js-express
1.了解Ajax 1.1 什么是ajax Ajax的全称是Asynchronous Javascript And XML(异步Js和XML). 通俗的理解:在网页中利用XMLHttpRequest对象和服务器进行数据交互的方式,就是Ajax 1.2 为什么要学习Ajax 之前所学的技术,…...
心理学笔记——我们如何思考-思想、语言和手语
我们如何思考-思想、语言和手语 研究语言的理论:计算理论、认知神经学、进化论 当我们讨论语言时,指的是英语、中文、日语这样的语言系统 所有语言都共享一些深层且复杂的共性,最直观的就是每一种语言都能够有效地表达抽象概念——思想、物…...
Matlab处理excel数据
我们新建个excel文档,用Matlab读取里面的内容,计算和判断里面的计算结果是否正确,并打印到另一个文档当中。 新建文档 新建输入文档,文件名TestExcel 编写脚本 [num,txt] xlsread(TestExcel.xlsx); SNcode num(:,1);%从序号中…...
某大厂关于Linux系统相关面试题
一、Linux系统和Shell 1、写一个sed命令,修改/tmp/input.txt文件的内容,要求:(1) 删除所有空行;(2) 在非空行前面加一个"AAA",在行尾加一个"BBB",即将内容为11111的一行改为࿱…...
Markdown(2篇文章学会Markdown
目录 1.文章链接:2.markdown可以用来解决什么问题:小结: 1.文章链接: Markdown(2篇文章学会Markdown第一篇 Markdown(2篇文章学会Markdown第二篇 2.markdown可以用来解决什么问题: 格式化文…...
多路IO复用服务器——select模型和poll模型
文章目录 一、多路IO复用服务器是什么?二、使用原理三、种类四、select模型五、select模型优缺点六、poll模型总结 一、多路IO复用服务器是什么? 服务器要与客户端完成tcp连接,并保持连接维护可用sock。 每个都需要准备一个进程管一个sock&a…...
【书生·浦语大模型实战营】学习笔记目录
【书生浦语大模型实战营01】《书生浦语大模型全链路开源体系》【书生浦语大模型实战营02】《轻松玩转书生浦语大模型趣味Demo》学习笔记【书生浦语大模型实战营03】《基于 InternLM 和 LangChain 搭建你的知识库》学习笔记【书生浦语大模型实战营04】《(4)XTuner 大模型单卡低成…...
APT32F1023X 发送RF433处理
1.硬件电路--CMT2110A 需要注意:发射端MCU写数据的频率要匹配,如果MCU发送中时间最小脉宽是1MS,那么它的发送需要设置为1kbps。 通过华普微USB调试工具PC软件RFPDK_V1.55查看设置是否正确。 2.RF433发送 用到的发送和接收代码来自“无线433发…...
如何做一个合格的产品经理
如何做一个合格的产品经理 如何做一个合格的产品经理 一、了解市场需求 产品经理的核心工作之一是了解市场需求。为了确保产品的成功,你需要密切关注市场动态,了解用户需求,分析竞争对手,并预测未来趋势。通过市场调查、用户访…...
Git 入门精讲
我们为什么要学习git? 就当下的发展而言,只要你从事开发就一定会接触git。作为最强大的分布式版本控制器,git 与 svn 有着本质上的区别。 Git是一种分布式版本控制系统,每个开发者都可以在本地维护完整的代码库,可以离…...
论文笔记(四十二)Diff-DOPE: Differentiable Deep Object Pose Estimation
Diff-DOPE: Differentiable Deep Object Pose Estimation 文章概括摘要I. 介绍II. 相关工作III. DIFF-DOPEIV. 实验结果A. 实施细节和性能B. 准确性C. 机器人-摄像机校准 V. 结论VI. 致谢 文章概括 作者:Jonathan Tremblay, Bowen Wen, Valts Blukis, Balakumar Su…...
设计模式:简单工厂模式
工厂设计模式属于创建型模式,它提供了一种创建对象的最佳方式。工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。工厂模式属于创建型模式,它在创建对象时提供了一种封装机制,将实际创建对象的代码与使用代码分离。 …...
老龄化对投资意味着什么?
1月15日,国务院办公厅印发《关于发展银发经济增进老年人福祉的意见》从4个方面提出26项举措,为我国首个以“银发经济”命名的政策文件。 近期,国信证券分析师王开发布题为《银发经济再思考:老龄化对投资的影响》的报告࿰…...
iOS日志与事件深度解析工具:iLEAPP技术架构与实战指南
iOS日志与事件深度解析工具:iLEAPP技术架构与实战指南 【免费下载链接】iLEAPP iOS Logs, Events, And Plist Parser 项目地址: https://gitcode.com/gh_mirrors/il/iLEAPP 在移动设备取证和数据分析领域,iOS系统的复杂性一直是技术人员的挑战。面…...
清华团队ISSCC新作解读:用eDRAM-LUT做存内计算,如何把存储单元变成加法器?
清华团队ISSCC新作:eDRAM-LUT如何重构存内计算芯片设计范式 当人工智能模型的参数量突破千亿级别时,传统计算架构的"存储墙"问题愈发凸显。数据在存储器和处理器之间的频繁搬运,消耗了系统60%以上的能耗——这恰恰是存内计算技术试…...
为什么你的脑影像分析总出错?聊聊AC-PC线标准化背后的原理与MIPAV实现
为什么你的脑影像分析总出错?AC-PC线标准化原理与MIPAV实战解析 在神经影像研究的实验室里,最常听到的抱怨莫过于"同样的分析方法,这次的结果怎么完全对不上?"。就像用不同比例尺的地图导航会迷路一样,忽略A…...
懒人精灵实战:用Lua脚本读写安卓手游内存(以libunity.so为例)
懒人精灵实战:用Lua脚本读写安卓手游内存(以libunity.so为例) 在移动游戏开发与逆向工程领域,内存读写技术一直是一个既神秘又实用的技能。对于想要深入了解游戏机制或进行自动化测试的开发者来说,掌握这项技术无疑会带…...
Acode移动代码编辑器:打造随时随地的高效编程体验
Acode移动代码编辑器:打造随时随地的高效编程体验 【免费下载链接】Acode Acode - powerful text/code editor for android 项目地址: https://gitcode.com/gh_mirrors/ac/Acode 在移动设备上编写代码时,你是否常常感到力不从心?小屏幕…...
如何快速掌握DLSS版本管理:专业用户的5个高效秘诀
如何快速掌握DLSS版本管理:专业用户的5个高效秘诀 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款能够让你轻松下载、管理和切换游戏DLSS、FSR和XeSS DLL文件的强大工具。通过这个开源项…...
霜儿-汉服-造相Z-Turbo惊艳作品展:AI复原历史人物经典汉服造型
霜儿-汉服-造相Z-Turbo惊艳作品展:AI复原历史人物经典汉服造型 最近,一个名为“霜儿-汉服-造相Z-Turbo”的AI模型在圈子里悄悄火了起来。它干的事儿挺有意思:不是凭空创造新形象,而是试图“复原”那些活在文字、画作和历史记忆里…...
零基础上手DownKyi:B站视频下载工具的高效使用指南
零基础上手DownKyi:B站视频下载工具的高效使用指南 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等ÿ…...
OpenClaw技能扩展:基于nanobot实现Markdown自动转换
OpenClaw技能扩展:基于nanobot实现Markdown自动转换 1. 为什么需要文档自动化转换 在日常工作中,我们经常需要处理各种格式的文档——Word、PDF、PPT、Excel甚至网页内容。手动将这些文档转换为Markdown格式不仅耗时,还容易出错。作为一名技…...
Phi-3 Forest Lab效果展示:对CI/CD流水线失败日志的因果推理与修复路径推荐
Phi-3 Forest Lab效果展示:对CI/CD流水线失败日志的因果推理与修复路径推荐 1. 引言:当森林智慧遇见工程难题 在软件开发的世界里,CI/CD流水线就像一条永不停歇的生产线。但当这条生产线突然停止运转时,开发团队往往要花费数小时…...
