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项举措,为我国首个以“银发经济”命名的政策文件。 近期,国信证券分析师王开发布题为《银发经济再思考:老龄化对投资的影响》的报告࿰…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...

如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...