C++ qt标题栏组件绘制

news2024/11/15 19:32:18

本博文源于笔者在学习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的时候,就会直接出现一个标题栏和一个窗体了。
在这里插入图片描述

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

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

相关文章

【禅道】下载安装及基本流程----【图文并茂】从头到尾讲解

目录 一 禅道简介 二 下载安装 三 基本流程 3.1添加用户(管理员) 3.2 添加产品 (产品经理) 3.2.1 创建模块 3.2.2 创建计划 3.2.3 创建需求 3.3 添加项目(项目经理) 3.3.1 设置团队 3.3.2 关联产品需求 3.2.3 分配任务 3.3.4 创建版本(研发人员) 3.3.5 提交测试 …

SecureCRT的安装

SecureCRT的安装 加强版的串口调试助手 全部默认安装&#xff0c;默认安装在c盘 SecureCRT收费&#xff0c;可以下载Putty安装 后续完善

关于Spring和缓存雪崩、穿透、击穿、预热的最常见的十道面试题

面试题一&#xff1a;什么是缓存雪崩&#xff1f;如何解决缓存雪崩&#xff1f; 缓存雪崩指的是在短时间内&#xff0c;有大量的请求直接查询术后句酷&#xff0c;从而对数据库造成大量的压力&#xff0c;严重情况下可能导致数据库宕机的情况叫做缓存雪崩 我们可以看一下正常…

k8s架构、工作流程、集群组件详解

目录 k8s概述 特性 作用&#xff08;为什么使用&#xff09; k8s架构 k8s工作流程 k8s集群架构与组件 核心组件详解 Master节点 Kube-apiserver Kube-controller-manager Kube-scheduler 存储中心 etcd Node Kubelet Kube-Proxy 网络通信模型 容器引擎 k8s核…

【C语言入门】分支和循环

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;C语言 个人主页&#xff1a;Celias blog~ 目录 引言 1. if语句 1.1 if 1.2 else 1.3 if的嵌套 2. 操…

python 正则表达式学习(1)

正则表达式是一个特殊的字符序列&#xff0c;它能帮助你方便的检查一个字符串是否与某种模式匹配。 1. 特殊符号 1.1 符号含义 模式描述^匹配字符串的开头$匹配字符串的末尾.匹配任意字符&#xff0c;除了换行符&#xff0c;当re.DOTALL标记被指定时&#xff0c;则可以匹配包…

计算机设计大赛 协同过滤电影推荐系统

文章目录 1 简介1 设计概要2 课题背景和目的3 协同过滤算法原理3.1 基于用户的协同过滤推荐算法实现原理3.1.1 步骤13.1.2 步骤23.1.3 步骤33.1.4 步骤4 4 系统实现4.1 开发环境4.2 系统功能描述4.3 系统数据流程4.3.1 用户端数据流程4.3.2 管理员端数据流程 4.4 系统功能设计 …

工厂HVAC暖通系统如何实现优化?

在工厂运营中&#xff0c;HVAC暖通系统是维持良好生产环境的关键组成部分。然而&#xff0c;由于能效低下&#xff0c;这些系统可能导致昂贵的能源开支&#xff0c;同时对环境造成负担。本文将深入研究工厂HVAC系统的能效低下原因&#xff0c;介绍HVAC系统优化的关键步骤&#…

老照片模糊不清怎么修复?教你几个修复模糊照片的方法

老照片&#xff0c;如同历史的见证者&#xff0c;承载着家族的记忆与故事。它们无声地诉说着我们的成长轨迹&#xff0c;将那些温馨而美好的瞬间永恒定格。然而&#xff0c;岁月无情&#xff0c;这些老照片逐渐变得模糊不清&#xff0c;甚至布满了岁月的痕迹&#xff0c;令我们…

【第六课课后作业】大模型评测

大模型评测 大模型评测安装环境安装数据准备查看支持的数据集和模型 启动测评评测结果 大模型评测 安装 环境安装 conda create --name opencompass --clone/root/share/conda_envs/internlm-base source activate opencompass git clone https://github.com/open-compass/ope…

防火墙安全策略以及NAT简易拓扑

实验需求 拓扑如下 前期的配置如二层交换机和防火墙的配置就不再赘述 感兴趣的童鞋可以看上一篇博客 防火墙路由模式简易拓扑-CSDN博客 这里主要讲一讲安全策略&#xff0c;用户认证以及NAT策略的配置 配置实现 安全策略 1.生产区在工作时间内可以访问DMZ区&#xff0c;仅…

Python requests网络库源码分析(第三篇:通过学习异常模块,了解http协议)

前言 作者在requests包下&#xff0c;定义了exceptions模块&#xff0c;该模块中定义执行http请求过程中常见的错误&#xff0c;熟悉这些错误有助于我们写出健壮的业务程序&#xff0c;同时还能温习http的知识点&#xff0c;本文基于的requests版本为2.27.1 exceptions模块&…

qt学习:tcp区分保存多个客户端

在前面文掌的tcp客服端服务端进行更改 qt学习&#xff1a;Network网络类tcp客户端tcp服务端-CSDN博客https://blog.csdn.net/weixin_59669309/article/details/135842933?spm1001.2014.3001.5501前面的服务端每次有新的客户端连接&#xff0c;就会覆盖掉原来的指针&#xff0…

Termux结合内网穿透实现无公网ip远程SFTP传输文件

目录 前言 1. 安装openSSH 2. 安装cpolar 3. 远程SFTP连接配置 4. 远程SFTP访问 4. 配置固定远程连接地址 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Termux结合内网穿透实现无公网ip远程SFTP传输文件&#xff0c;希望大家能…

CentOS7自动备份数据库到git

虽然数据库没什么数据&#xff0c;但是有就是珍贵的啦&#xff0c;为了服务器什么的无了&#xff0c;所以还是要自动备份一下比较好。 Open备忘第一页 步骤 在Gitee&#xff08;github&#xff09;上创建一个私有仓库Gitee&#xff08;github&#xff09;配置好服务器的ssh在服…

DAY10_SpringBoot—SpringMVC重定向和转发RestFul风格JSON格式SSM框架整合

目录 1 SpringMVC1.1 重定向和转发1.1.1 转发1.1.2 重定向1.1.3 转发练习1.1.4 重定向练习1.1.5 重定向/转发特点1.1.6 重定向/转发意义 1.2 RestFul风格1.2.1 RestFul入门案例1.2.2 简化业务调用 1.3 JSON1.3.1 JSON介绍1.3.2 JSON格式1.3.2.1 Object格式1.3.2.2 Array格式1.3…

mysql 多版本并发控制mvcc

行级锁的一个变种避免了加锁&#xff0c;开销低非阻塞读操作&#xff0c;写操作是行级原理&#xff1a;使用数据在某个时间点的快照实现&#xff0c;不同事务在同一个时间可以看到同一个表中的不同数据。分类&#xff1a;乐观&#xff0c;悲观在一行中存储更多数据&#xff0c;…

芯片查询工具:道合顺电子网助您轻松实现芯片查询、分析与调试

在电子领域&#xff0c;对芯片进行准确的查询、分析和调试是确保设备正常运行和故障排查的关键步骤。为了帮助用户轻松实现这一过程&#xff0c;道合顺电子网提供了一系列高效的芯片查询工具&#xff0c;助您快速获取所需信息、分析数据以及进行灵活的调试操作。 为什么选择道…

SpringMVC-HttpMessageConverter 报文信息转化器

文章目录 HttpMessageConverter一、概念二、RequestBody三、RequestEntity四、 ResponseBody1.返回JSON格式的字符串 五、RestController六、ResponseEntity HttpMessageConverter 一、概念 报文信息转化器&#xff0c;将请求报文转化为Java对象&#xff0c;或将Java对象转化…

使用云手机运营TikTok,实现更多可能性

在数字化时代&#xff0c;社交媒体平台的崛起改变了商业推广和品牌建设的方式。TikTok&#xff0c;作为一款风靡全球的短视频应用&#xff0c;吸引了数以亿计的用户。对于跨境电商和品牌推广而言&#xff0c;使用云手机运营TikTok可以实现多种功能&#xff0c;让运营变得更加灵…