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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JS-M端事件

移动端也有自己独特的地方。比如触屏事件touch&#xff08;也称触摸事件&#xff09;&#xff0c;Android和IOS都有。 1&#xff09;touch对象代表一个触摸点。触摸点可能是一根手指&#xff0c;也可能是一根触摸笔。触屏事件可响应用户手指&#xff08;或触控笔&#xff09;对…

mysql高可用设计,主库挂了怎么办

实际上高可用就是系统能提供的一种无故障服务能力&#xff0c;就是避免宕机出现不能服务的场景。 首先来说对于无状态服务的高可用设计是比较简单的&#xff0c;发现有不能用的就直接停了换别的服务器就行&#xff0c;比如Nginx。这里说一下无状态服务就是不需要记录你的状态、…

redo log

问&#xff1a;redo log是什么&#xff1f;拿来干嘛的&#xff1f; 现象&#xff1a;如果提交一个事务&#xff0c;就刷新一次磁盘。那么会存在如下问题&#xff1a; 1、单改一条记录&#xff0c;至少都是刷新一个页&#xff0c;造成大量的磁盘I/O浪费 2、随机I/O比连续I/O慢&a…

智能洗地机哪款好用?全能型洗地机推荐

家庭清洁产品是我们生活中熟悉的存在&#xff0c;对于注重清洁的家庭来说&#xff0c;在选择清洁用品时不可避免地会考虑洗地机。相比传统的拖把&#xff0c;使用洗地机确实给人更好的体验。从理论上来说&#xff0c;洗地机作为一种吸尘和拖地一体的清洁工具&#xff0c;能够应…

智能照明控制系统智能化管理

传统的照明控制系统和智能照明控制系统之间的区别&#xff1a; 传统的照明控制系统开关方式比较单一只有“开”和“关”&#xff1a;但是智能那个照明控制系统可以采用“调光模式”通过光源的调光适应不同使用场合下的不同的灯光效果&#xff0c;能够营造出不同场景的氛围感。…

(2024,-DAE,去噪 DM,去噪 AE,影响 SSRL 性能的关键成分,PCA 潜在空间)解构自监督学习的去噪扩散模型

Deconstructing Denoising Diffusion Models for Self-Supervised Learning 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 4. 解构去噪扩散模型 4.1. 用于自监督学习的重新…

【Java面试】redis

目录 Redis 介绍Reids常用5种数据类型一个字符串类型的值能存储最大容量是多少&#xff1f;Redis 有哪些适合的场景&#xff1f;Redis的并发竞争问题如何解决?什么是缓存穿透&#xff1f;如何避免&#xff1f;什么是缓存雪崩&#xff1f;何如避免&#xff1f;Redis 中设置过期…

VISA 通过USB的接口控制 万用表,指令说明

//申明一个万用表设备&#xff0c;以及初始化配置 var session (Ivi.Visa.IMessageBasedSession)Ivi.Visa.GlobalResourceManager.Open(ID_34461A); session.FormattedIO.WriteLine("CONF:VOLT:DC"); session.FormattedIO.WriteLine("VOLT:DC:NPLC 10"); …

Linux的文件系统、软硬链接、动静态库

前要&#xff1a;本次我想给您带来关于 IO 和文件的知识&#xff0c;而文件在本系列中分为内存上的文件和磁盘上的文件。 1.文件概念 1.1.文件读写 在谈及系统接口之前&#xff0c;我们先来从 C 语言的角度来谈及一些前要知识&#xff0c;以辅助我们后续来理解系统 IO。 我们…

Web3:B站chainlink课程Lesson5遇到的小坑汇总

ethers代码 我用的ethers.js 6 &#xff0c;和视频里一样用的是5的不用看代码部分 ethers.providers.JsonRpcProvider("server") //无了 ethers.JsonRpcProvider("server") //现在的wallet.getTransactionCount() //无了 wallet.getNonce() //现在的Big…

【代码】使用预训练的语义分割网络

P274书上的代码&#xff0c;这里是从ipynb文件中按顺序复制来的&#xff1a; 使用到的图片如下&#xff1a; 代码&#xff1a; import numpy as np import pandas as pd import matplotlib.pyplot as plt import PIL import torch from torchvision import transforms impor…

【算法与数据结构】377、LeetCode组合总和 Ⅳ

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题明面上说是组合&#xff0c;实际上指的是排列。动态规划排列组合背包问题需要考虑遍历顺序。 d p …

CentOS7服务器的安装配置连接客户端Xshell进行使用

目录 一. CentOS7的安装【在虚拟机中】 二. 查看设置IP地址 三. 安装并连接客户端软件Xshell 3.1 安装Xshell 3.2 xshell连接centos7服务器 四. 切换国内源 一. CentOS7的安装【在虚拟机中】 首先创建一个虚拟机&#xff0c; 这个没什么好说的&#xff0c;基本上都是下…

【linux-虚拟化】 SR-IOV技术

文章目录 参考1. 什么是 SR-IOV?1.2. 将 SR-IOV 网络设备附加到虚拟机1.3. SR-IOV 分配支持的设备 参考 管理 SR-IOV 设备 1. 什么是 SR-IOV? 单根 I/O 虚拟化(SR-IOV)是一种规范&#xff0c;它允许单个 PCI Express(PCIe)设备向主机系统呈现多个独立的 PCI 设备&#xff…

【免费分享】全国道路网(分级)矢量数据

纯爱好 个人分享 数据详情 全国道路网&#xff08;分级&#xff09;矢量数据 地址&#xff1a;资源下载-数字地球开放平台 (geovisearth.com) 数据属性 数据名称&#xff1a;全国道路网&#xff08;分级&#xff09;矢量数据 道路类型分类&#xff1a;高速、国道、省道、铁…

科技云报道:金融大模型落地,还需跨越几重山?

科技云报道原创。 时至今日&#xff0c;大模型的狂欢盛宴仍在持续&#xff0c;而金融行业得益于数据密集且有强劲的数字化基础&#xff0c;从一众场景中脱颖而出。 越来越多的公司开始布局金融行业大模型&#xff0c;无论是乐信、奇富科技、度小满、蚂蚁这样的金融科技公司&a…

SpringMVC 环境搭建入门

SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架&#xff0c;属于SpringFrameWork 的后续产品&#xff0c;已经融合在 Spring Web Flow 中。 SpringMVC 已经成为目前最主流的MVC框架之一&#xff0c;并且随着Spring3.0 的发布&#xff0c;全面…

scoped属性和深度选择器

在Vue单文件组件&#xff08;SFC&#xff09;中&#xff0c;为了防止样式全局污染&#xff0c;可以给 所有的scoped的css编译出来都会变成.class[哈希值]的形式 我们只能修改带data-v-0dca3a9a作用域的样式&#xff0c;像是 如果修改el-table的宽度 .el-table {width: 60…

开发AI软件,构建多用户AIGC系统,实现图文创作及源码交付

在AI技术不断进步的今天&#xff0c;AI软件开发已成为一个热门的领域。而多用户AIGC系统作为AI软件开发的重要项目之一&#xff0c;呈现出极大的潜力和前景。 多用户AIGC系统旨在为用户提供一个全面的图文创作平台&#xff0c;借助AI的力量&#xff0c;使创作过程更加智能化和…

python写一个彩票中奖小游戏修订版本

先说规则&#xff1a; print("下面介绍双色球颜色规则:")print("一等奖,投注号码与当期开奖号码全部相同&#xff08;顺序不限&#xff0c;下同&#xff09;&#xff0c;即中奖")print("二等奖:投注号码与当期开奖号码中的6个红色球号码相同,即中奖&q…