【简单易用】基于Qt的跨平台自定义标题栏控件QJamWindow

2023-11-16

一、概述

       QJamWindow是一个基于Qt的跨平台自定义标题栏控件,你可以通过它方便得设计出属于自己的标题栏。

      特性:

           1.标题栏高度可调,标题栏背景色设定

           2.图标及其尺寸,图标背景色设定

           3. Control box宽度,鼠标经过,按下颜色设置

           4. Control box最大化最小化按钮使能,图片替换

           5. 双击切换最大化和Normal。

           6. Sizeable设置

           7. 支持发光/非发光外边框,投影颜色可设

           8. 窗体背景色,外边框色,内边框色,留白宽度(padding)

           9. 标题栏添加任意控件

          10. 兼容QWidget,QDialog,QMainWindow

          11. 跨平台


  : 260271262              :852374570              :西安


工程提供得例程 Tester是对QJamWindow的应用示例,其最终展示效果如下。

 图1. QJamWindow效果图1-浅色发光/内边线

图2. QJamWindow效果图 2-深色发光/内边线

图3. QJamWindow效果图 3-不发光/内外边线

图4. Ubuntu下的应用实例

二、使用指南

1. QJamWindow

    用于替代QMainWindow,实现带有菜单工具栏和状态栏的QMainWindow定制化。

1.1 新建Application(Qt)/Qt Widgets Application。

1.2 Base class选择QMainWindow。

1.3 包含QJamWindow.h,并将MainWindow继承关系改为QJamWindow

1.4 在MainWindow.cpp中合适的位置(一般是在显示前)调用InitializeUI函数,如果要对本窗口进行其他个性化设置,需要在此函数之前进行设定,否则将默认与其他窗口风格保持一致。

1.5 布置界面时,确保最底层是已经栅格化或者水平,垂直布局的容器,否则绘制的标题栏可能会覆盖控件。

1.6 避免重写resizeEvent事件。

MainWindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include "../QJamWindow/QJamWindow.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QJamWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

};

#endif // MAINWINDOW_H

  MainWindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QJamWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //如果需要对本窗口做个性化设置,在InitializeUI之前进行设置,否则将默认与其他窗口风格一致。
    //_innerBorderColor = QColor(160, 160, 160);//扁平型硬边沿-颜色
    //_outerBorderColor = QColor(160, 160, 160);//扁平型硬边沿-颜色

    InitializeUI(true, true);
    
}

2. QJamWidget

    用于替代QWidget,实现一般弹出式面板UI定制化。

2.1 添加ui/h

2.2 Base class选择QWiget。

2.3 包含QJamWindow.h,并将继承关系改为QJamWidget

2.4 在cpp中合适的位置(一般是在显示前)调用InitializeUI函数,如果要对本窗口进行其他个性化设置,需要在此函数之前进行设定,否则将默认与其他窗口风格保持一致。

2.5 布置界面时,确保最底层是已经栅格化或者水平,垂直布局的容器,否则绘制的标题栏可能会覆盖控件。

2.6 避免重写resizeEvent事件。

3. QJamDialog

    用于替代QDialog,实现对话框式面板UI定制化。

3.1 添加ui/h

3.2 Base class选择QDialog。

3.3 包含QJamWindow.h,并将继承关系改为QJamDialog

3.4 在cpp中合适的位置(一般是在显示前)调用InitializeUI函数,如果要对本窗口进行其他个性化设置,需要在此函数之前进行设定,否则将默认与其他窗口风格保持一致。

3.5 布置界面时,确保最底层是已经栅格化或者水平,垂直布局的容器,否则绘制的标题栏可能会覆盖控件。

3.6 避免重写resizeEvent事件。

4. 定制属于自己的风格

4.1 titlebar

    在QJamWindow的titlebar.cpp源码中简单修改,就可以方便得为Titlebar定制更多内容,比如背景颜色,icon,controlbox按钮尺寸,controlbox按钮图标,controlbox按钮hover颜色,controlbox安修按下去的颜色等,你也可以为titlebar增加任意多个控件。

4.2 InitializeUI

   在QJamWindow.cpp的InitializeUI函数中,有各种属性的设置项,这样做的目的是保证其他默认继承于此的面板,保持同一种风格。使用发光边缘时下方代码里使用 #if 1,否则使用 #if 0。

  

void QJamWidget::InitializeUI(bool _sizeable, bool _extbtn, bool _minable, bool _maxable, bool _closeable, bool _moveable)
{
    #if 1
        //BS_SHADOW模式
        _borderStyle = BS_SHADOW;//当_borderType为BS_SHADOW时,_shadowBorderColor,_backColor起作用;_outerBorderColor无效
                                                //当_borderType为BS_SOLID时,_outerBorderColor起作用;_shadowBorderColor,_backColor无效

        _backColor = QColor(230,231,232);//_borderType为BS_SHADOW时未被绘制区域的背景色
        _shadowBorderColor = QColor(150, 151, 152);//渐变阴影型边沿-颜色
    #else
        //BS_SOLID模式
        _borderStyle = BS_SOLID;//当_borderType为BS_SHADOW时,_shadowBorderColor,_backColor起作用;_outerBorderColor无效
                                                //当_borderType为BS_SOLID时,_outerBorderColor起作用;_shadowBorderColor,_backColor无效

         _outerBorderColor = QColor(250, 110, 30);//扁平型硬边沿-颜色
    #endif

    _titleBarHeight = 30;//标题栏高度

    _titleBarBackColor  = QColor(64,65,66);//背景颜色
    _titleBarTitleColor = QColor(230,231,232);//标题文本颜色
    _titleBarTitleBackColor = _titleBarBackColor;

    _titleCtrlBoxWidth = 24;//按钮的宽度
    _titleIconWidth = 20;//图标的宽度

    _padding = 1;//边沿至内容之间的距离,不能为0,否则无法正常绘制内外边线
                         //当BorderStyle为BS_SHADOW时,_margin区域被_backColor颜色填充,_padding越大,内边缘线与阴影之间的距离越大。
                         //当BorderStyle为BS_SOLID时,代表内边框与外边框之间的间隔。当_padding=1时,只能绘制内边框,_padding >= 2时,才能绘制外边框。

    _isShowRoundedRect = false;//是否阴影为圆角矩形

    _isShowInnerBorder = true;
    _innerBorderColor = QColor(245, 100, 20);//内边沿-颜色

    SHADOW_WIDTH = 10;//光晕的宽度
    BORDER_DRAG_WIDTH = 2;//用于设置触发边缘检测的像素范围

    this->setWindowFlags(Qt::FramelessWindowHint);

    if(_borderStyle==BS_SHADOW)
        this->setAttribute(Qt::WA_TranslucentBackground, true);

    _titleBar = new TitleBar(_minable, _maxable, _closeable, _extbtn, _titleBarHeight, _titleCtrlBoxWidth, _titleIconWidth, _padding, this);
    _titleBar->setBackColor(_titleBarBackColor);

    _titleBar->setWindowTitle(this->windowTitle());
    _titleBar->setWindowTitleColor(_titleBarTitleColor);

    _titleBar->setWindowIconBackColor(_innerBorderColor);
    _titleBar->setWindowIcon(this->windowIcon().pixmap(128, 128));
    this->setWindowIcon(this->windowIcon().pixmap(128, 128));

    _framesHelper = new FramelessHelper(_padding, _borderStyle==BS_SHADOW?true:false, SHADOW_WIDTH, this);
    _framesHelper->setTitleHeight(_titleBarHeight);  //设置窗体的标题栏高度
    _framesHelper->setBorderWidth(BORDER_DRAG_WIDTH);//鼠标在边缘时,有2个像素的范围内检测边缘。
    _framesHelper->setWidgetMovable(_moveable);  //设置窗体可移动
    _framesHelper->setWidgetResizable(_sizeable);  //设置窗体可缩放
    _framesHelper->setRubberBandOnMove(false);  //设置橡皮筋效果-可移动
    _framesHelper->setRubberBandOnResize(false);  //设置橡皮筋效果-可缩放
    _framesHelper->activateOn(this);  //激活当前窗体

    if(_borderStyle == BS_SHADOW)
        this->resize(this->width() + 2*(SHADOW_WIDTH+_padding), this->height() + _titleBarHeight + 2*(SHADOW_WIDTH+_padding));
    else
        this->resize(this->width() + 2*_padding, this->height() + _titleBarHeight + 2*_padding);
}

       总结:从以上步骤来看,整个过程是通过Main启动一个MainWidget对象,而该MainWidget对象又包装了一个QMainWindow对象,从而展示出一个标题栏被重新绘制的MainWindow。

        演示版免费下载:

        基于Qt的跨平台自定义标题栏控件JCustomWidget演示程序-C++文档类资源-CSDN下载

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【简单易用】基于Qt的跨平台自定义标题栏控件QJamWindow 的相关文章

  • 如何搭建qtwayland?

    我花了一整天的时间尝试使用QtWayland Compositor 1 0在 Qt 创建者中 我已经遵循了从那里开始的所有步骤https wiki qt io QtWayland https wiki qt io QtWayland但我收到
  • 使用 QSet 作为 Qt 地图容器中的键

    我需要一个映射 其中键是唯一的 并且每个键都是一组或自定义 POD 结构 其中包含 3 个数据项 这些值只是指向对象实例的指针 从阅读Qt 的 QMap 与 QHash 的文档 http qt project org doc qt 4 8
  • 带 Qt 的菜单栏/系统托盘应用程序

    我是 Qt PyQt 的新手 我正在尝试制作一个应用程序 其功能将从菜单栏 系统托盘执行 这里展示了一个完美的例子 我找不到关于如何做到这一点的好资源 有人可以建议吗 Thanks 我认为您正在寻找与QMenu and QMainWindo
  • 通过CMake实现Qt项目

    我正在尝试通过 Cmake 构建并运行非常简单且基本的 Qt 示例 删除 pro 文件 以下是Qt项目的代码 自动生成的Qt项目的目录结构为 Cmake my project name headers mainwindow h source
  • 如何通过 Qt 创建网络服务 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 QT 安装程序框架中区分每用户安装与系统范围安装?

    我正在使用一些名为 pgModeler 的应用程序 它的当前版本提供了一个基于 QT 安装程序框架的安装程序 Windows 上该安装程序的问题是它安装每个用户的开始菜单条目 https github com pgmodeler pgmod
  • 无法在 QGLWidget 中设置所需的 OpenGL 版本

    我正在尝试在 Qt 4 8 2 中使用 QGLWidget 我注意到 QGLWidget 创建的默认上下文不显示 OpenGL 3 1 以上的任何输出 Qt wiki 有一个教程 http qt project org wiki How t
  • 如何在 QT 中绘制点?

    我正在用 QT 用 C 编写一个应用程序 其中有 n 个点并计算它的凸包 然而 一旦计算出来 我不知道如何绘制点并绘制船体的边界 制作菜单按钮等很简单 但我不确定我是否知道执行此操作的工具 你怎么做到这一点 图形视图 addEllipse
  • 打开和关闭附加窗口 (QML)

    目前我有一个通过以下方式打开的窗口 property variant win Button id testButton MouseArea onClicked var component Qt createComponent test qm
  • 仅在内部/外部抚摸路径?

    Given a QPainterPath http qt project org doc qt 4 8 qpainterpath html如何仅在路径的内侧或外侧边缘 或非闭合路径的左侧或右侧 描边路径 QPainter strokePat
  • 如何在 Qt Creator 中编辑 QtWebKit 的右键上下文菜单?

    好吧 这是我的困境 我正在使用 Qt Creator 制作一个使用 Webkit 的简单应用程序 我认为 Qt Creator 会有一种简单的方法来使用信号和槽编辑器编辑右键单击上下文菜单 但事实证明这不是真的 我知道 webkit 有与上
  • 有没有办法向 QListView 添加部分?

    我正在使用 Qt5 2 和 C 来实现一个应用程序 需要显示一个列表 其中包含类似于下面的示例图像的部分 source ngo hung com http www ngo hung com files images contact list
  • QT:删除QGridLayout中QLabel之间的空格

    我将一些具有不同颜色的 QLabels 添加到 QGridLayout 作为 QWidget 的布局 现在我在每个 Qlabel 与下一个 Qlabel 之间有一个间距 我想将其删除 我尝试将标签的边距设置为 0 将 GridLayout
  • Qt 为什么使用 QString::number() 而不是 QLocale().toString()?

    我正在开发的应用程序将在许多国家推出 并且需要支持他们的语言 我一直在回顾我的代码并替换以下每个实例 QString number and QString toDouble with QLocale toString and QLocale
  • 使用 CMake 编译时更改头文件位置会导致缺少 vtable 错误

    对于一个大型 C 项目 我需要从 qmake 过渡到 CMake 但是在处理一个玩具示例时 我遇到了一些我不理解的行为 示例代码具有单个头文件 当该头文件移动到子目录中时 我收到 MainWindow 类缺少 vtable 的错误 CMak
  • 如何在Qt 5中的paintEvent上使用mouseMoveEvent?

    我是 Qt 和 c 的新手 所以我遇到了一些困难 我正在尝试创建一个小部件 它可以获取 mouseMoveEvent 位置并在鼠标位置的像素图上绘制椭圆 下面你可以看到代码 include myimage h include
  • Mac OS X 上的 Qt 字体系列和样式

    我有一个基于 Qt PyQt 的 GUI 应用程序 在 Mac OS X 和其他平台 上运行 它允许用户选择字体并具有粗体和斜体选项的复选框 在更新到新的基于 Cocoa 的 Qt 时 用户发现QFontComboBox不再显示不同的字体样
  • 了解 Qt3D 创建的网格

    我创建了一个 Qt3D 网格 如下所示 Qt3DCore QEntity newEntity new Qt3DCore QEntity Qt3DExtras QConeMesh mesh new Qt3DExtras QConeMesh m
  • QFileSystemModel setRootPath

    我正在尝试创建一个 Qt 应用程序来显示文件夹 Mac OS 中的 Users 文件夹 的内容 这是代码 QFileSystemModel dirModel new QFileSystemModel dirModel gt setRootP
  • QML 列表视图拖放

    我想创建两个 qml 列表视图 可以执行两个功能 拖放一个列表中的项目以更改项目的顺序 跨列表拖放项目 项目将从一个列表中删除并添加到另一个列表中 根据 Qt 文档中的拖放示例 我决定创建两个访问同一列表模型的列表视图 列表模型中的每个项目

随机推荐

  • git的使用和规划

    1 拉取项目 在拉取项目的时候使用git rebase 这样分支管理更加清晰 2 提交项目 commit的时候不要把不希望别人看到的改到都commit上 commit的时候 要检查修改的文件代码书写是否正确 下图中打钩文件为想要提交的文件
  • SQL中EXISTS理解使用

    SQL中EXISTS的理解使用 关联子查询 EXISTS理解使用 关联子查询 在讲述EXISTS用法之前 先讲述一下关联子查询 关联子查询 是指在内查询中需要借助于外查询 而外查询离不开内查询的执行 举个栗子 在Oracle中自带的EMP表
  • Objective-C块block介绍

    块的定义 返回值类型 形参类型 形参1 形参类型 形参2 块执行体 以上是一个块的写法 1 返回值类型可以省略 形参也可以参略 但是形参的括号不能参略 NSLog 123 通常我们需要反复调用块 因为块相当于一个匿名的函数 我们调用它时可以
  • 在VMware中设置ubuntu与Windows共享文件夹

    本机系统 win7 使用vmware安装的unbutu 之前在win7上下载了一些文档和软件 想在虚拟机中使用 结果发现读取不了这些文件 头疼了一下午 从网上搜索了很多资源 发现没有一个完整的文章可以一次搞定 头疼 这里就总结一下我的方法
  • I2C与SPI通信总线协议

    仅以寄存器地址为8Bit的器件为例 例如MPU6500 LSM6DS3 I2C通信协议 I2C 的要点是了解I2C通信帧的组成部分 START起始位 STOP停止位 ACK NACK信号 从机器件地址 从机寄存器地址 I2C读的时序比较繁琐
  • K8S访问控制------认证(authentication )、授权(authorization )体系

    一 账号分类 在K8S体系中有两种账号类型 User accounts 用户账号 即针对human user的 Service accounts 服务账号 即针对pod的 这两种账号都可以访问 API server 都需要经历认证 授权 准
  • Linux根目录爆满,解决(/dev/mapper/rhel-root 98%问题)

    1 首先确定是否是磁盘空间不足 输入命令 df h 查看磁盘信息 发现已经使用率达到96 所有需要删除大文件数据 2 其次查找大文件 du h max depth 1 命令代表寻找当前目录 哪个文件夹占用空间最大 进入根目录 root vl
  • 六级英语词汇

    genuine d enju n fake If this offer is genuine I will gladly accept it 如果这份帮助是真诚的 我将愉快地接受它 一 单词关 whereas we r z conj 然而
  • [YOLO专题-17]:YOLO V5 - 如何把YOLO训练数据集批量转换成带矩形框的图片

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122344955 目录 前言 第1章
  • 利用Spring框架在前端实现对数据库的增删改查

    在前端页面上显示购物数据库数据 并且可以这增 删 改 查 1 首先在WEB 配置文件
  • 交叉熵:pytorch版本 vs 日常版本

    首先看下平时我们所说的交叉熵 传送门 在信息论中 交叉熵可认为是对预测分布q x 用真实分布p x 来进行编码时所需要的信息量大小 而在机器学习的分类问题中 真实分布p x 是one hot形式 表明独属于one hot中1对应的角标的那个
  • cpuz测试分数天梯图_2015最新cpu天梯图 cpu性能排行榜

    西安兵马俑在线3月19日讯查找排名方法 搜索CPU型号 例如 按Ctrl F键 搜 i7 5960X 这个CPU型号 若需获知个人使用的电脑CPU具体型号 查看计算机属性 或用CPU Z这个软件 常用名词解释 CPUModel 处理器型号
  • vsCode关闭代码检查工具

    在script标签里 第一行输入下面的内容即可 转载于 https www cnblogs com caoxueying2018 p 10062329 html
  • 内核运行环境

    复杂度2 5 机密度2 5 最后更新2021 05 06 AIX内核有两种运行环境 process environment和interrupt environment 用户进程call内核系统调用 或者内核系统调用嵌套call其它系统调用
  • 2023年信息与通信工程国际会议(JCICE 2023)

    会议简介 Brief Introduction 2023年第二届信息与通信工程国际会议 JCICE 2023 会议时间 2023年5月12日 14日 召开地点 中国 成都 大会官网 JCICE 2023 2023 International
  • DeeplabCut安装教程(CPU)版

    DeeplabCut安装教程 CPU 版 文章目录 DeeplabCut安装教程 CPU 版 前言 安装步骤 1 进入官网下载对应的DeepLabCut zip文件 附官网链接 2 解压到任意位置 3 打开Anaconda Navigato
  • c++模板(函数模板,类中函数模板,类模板)

    作用 减少程序中的冗余信息 如 多个函数或类的除了参数类型外 其余都完全相同时 可以使用模板来减少重复信息 参考函数重载时 输入参数数量也相同的情况 1 函数模板 即建立一个通用函数 只不过该函数的返回类型和形参类型都不具体指定 其定义格式
  • Python实现找零兑换的三种解法

    找零兑换 找零兑换问题最直接的解法就是贪心策略 比如问题 有面值1 5 10 25的硬币 求解兑换63元所需的最少硬币数 贪心策略的思想就是不断的利用面值最大的硬币去尝试 不行了 在尝试较小面值的硬币 该例中也即使用25的硬币去尝试 2枚2
  • 华为服务器怎么换系统,云服务器怎么更换系统

    云服务器怎么更换系统 内容精选 换一换 弹性云服务器系统密码涉及到客户重要的私人信息 提醒您妥善保管密码 如果您忘记密码或密码过期 可以重置密码 如果弹性云服务器提前安装了密码重置插件 请参见在控制台重置弹性云服务器密码 使用公共镜像的弹性
  • 【简单易用】基于Qt的跨平台自定义标题栏控件QJamWindow

    一 概述 QJamWindow是一个基于Qt的跨平台自定义标题栏控件 你可以通过它方便得设计出属于自己的标题栏 特性 1 标题栏高度可调 标题栏背景色设定 2 图标及其尺寸 图标背景色设定 3 Control box宽度 鼠标经过 按下颜色