1.在窗口显示之前,设置WindowFlags为FramelessWindowHint,以产生一个没有边界的窗口

例如

Widget::Widget(QWidget *parent) :
QWidget(parent, Qt::FramelessWindowHint), //在此设置WindowFlags
ui(new Ui::Widget)
{
ui->setupUi(this);
//setWindowFlags(Qt::FramelessWindowHint); 或在构造函数体中设置
}

2.在设计器中,拖一个Widget到窗口上。为方便描述,我命名此Widget为titleBarWidget

将titleBarWidget的minimumSize->height改为30,以固定标题栏高度

更改titleBarWidget的样式表为background-color: #12B7F5;

再拖一个Vertical Spacer到窗口上,并设置窗口为竖直布局

为去除标题栏边距,将layoutLeftMargin、layoutTopMargin和layoutRightMargin都设置为0

效果如图

3.为了能拖动标题栏移动窗口,我们定义一个类,如下

TitleBarWidget.h

#ifndef TITLEBARWIDGET_H
#define TITLEBARWIDGET_H #include <QWidget> class TitleBarWidget : public QWidget
{
Q_OBJECT
public:
explicit TitleBarWidget(QWidget *parent = nullptr);
protected:
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);
private:
int differenceX, differenceY;
}; #endif // TITLEBARWIDGET_H

TitleBarWidget.cpp

#include "TitleBarWidget.h"
#include <QMouseEvent> TitleBarWidget::TitleBarWidget(QWidget *parent) : QWidget(parent) { } void TitleBarWidget::mousePressEvent(QMouseEvent *event)
{
QWidget *parentWidget = static_cast<QWidget *>(parent());
differenceX = event->globalX() - parentWidget->x();
differenceY = event->globalY() - parentWidget->y();
} void TitleBarWidget::mouseMoveEvent(QMouseEvent *event)
{
int x = event->globalX() - differenceX;
int y = event->globalY() - differenceY;
QWidget *parentWidget = static_cast<QWidget *>(parent());
parentWidget->move(x, y);
}

将titleBarWidget提升为TitleBarWidget,就能实现拖动标题栏移动窗口了

4.然而问题来了,titleBarWidget的样式表失效了

为解决这个问题,需要重写QWidget中的paintEvent,代码如下

void TitleBarWidget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event)
QStyleOption option;
option.init(this);
QStylePainter painter(this);
painter.drawPrimitive(QStyle::PE_Widget, option);
}

Qt笔记之使用设计器自定义窗口标题栏的更多相关文章

  1. Qt编写自定义控件属性设计器

    以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用场景需 ...

  2. WPF 使用 WindowChrome,在自定义窗口标题栏的同时最大程度保留原生窗口样式(类似 UWP/Chrome)

    WPF 自定义窗口样式有多种方式,不过基本核心实现都是在修改 Win32 窗口样式.然而,Windows 上的应用就应该有 Windows 应用的样子嘛,在保证自定义的同时也能与其他窗口样式保持一致当 ...

  3. Qt 之 自定义窗口标题栏(非常完善)

    http://blog.csdn.net/goforwardtostep/article/details/53494800

  4. JavaFX(二)自定义窗口标题栏

    1.问题场景 PC客户端登录界面仿QQ,上边显示图片,下边显示输入框和登录按钮.而JavaFX默认的窗口,不满足需求. 2.解决思路 隐藏窗口默认的标题栏,使用创建label对象,使用css将按钮图片 ...

  5. WPF 自定义窗口标题栏

    1.建一个WPF资源词典,在其中定义窗口样式,并在App.xaml中指定其为程序资源 2.写一个继续自windows的类,并指定这个类的Style为第一步资源里的样式 3.新建窗口时,分别把xaml文 ...

  6. JavaFX 之自定义窗口标题栏(二)

    一.问题场景 PC客户端登录界面仿QQ,上边显示图片,下边显示输入框和登录按钮.而JavaFX默认的窗口,不满足需求. 二.解决思路 隐藏窗口默认的标题栏,使用创建label对象,使用css将按钮图片 ...

  7. [Qt5] 使用Qt设计器绘制主窗口

    实践代码: git clone https://github.com/dilexliu/learn_qt5.git Step1: Qt设计器绘制窗口 保存会得到一个文件: mainwindow.ui ...

  8. WPF编程,使用WindowChrome实现自定义窗口功能的一种方法。

    原文:WPF编程,使用WindowChrome实现自定义窗口功能的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/arti ...

  9. QT笔记之自定义窗口拖拽移动

    1.QT自定义标题栏,拖拽标题栏移动窗口(只能拖拽标题,其他位置无法拖拽) 方法一: 转载:http://blog.sina.com.cn/s/blog_4ba5b45e0102e83h.html . ...

随机推荐

  1. WEB学习-CSS行高、字体,链接的美化以及背景

    行高和字号 CSS中,所有的行,都有行高.盒模型的padding,绝对不是直接作用在文字上的,而是作用在“行”上的. 单行文本垂直居中 文本在行里面是居中 其中,行高:盒子高; 需要注意的是,这个小技 ...

  2. 可能是全网最详细的express--middleware

    写在前面 hello,小伙伴们,我是你们的pubdreamcc,本篇博文出至于我的GitHub仓库node学习教程资料,欢迎小伙伴们点赞和star,你们的点赞是我持续更新的动力. GitHub仓库地址 ...

  3. luogu P2894 [USACO08FEB]酒店Hotel

    题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a ...

  4. 一分钟学会Spring Boot多环境配置切换

    一. 问题由来 开发环境.测试环境.生产环境--------我们的软件在不同的环境中,系统参数和配置可能会不一样,比如数据源配置.日志文件配置.以及一些软件运行过程中的基本配置,那每次我们将软件部署到 ...

  5. 1.搭建maven,eclipse创建maven项目

    1.下载maven包,下载地址为:http://maven.apache.org/download.cgi 2.解压zip包 3.eclipse 引入maven: window-Preferences ...

  6. JavaEETest

    原文:https://github.com/lenve/JavaEETest

  7. Objc的底层并发API(转)

    本文由webfrogs译自objc.io,原文作者Daniel Eggert.   小引 本篇英文原文所发布的站点objc.io是一个专门为iOS和OS X开发者提供的深入讨论技术的平台,文章含金量很 ...

  8. Access自定义函数(人民币大写)

    人民币大写函数:整数不超过13位. Public Function 人民币大写(A) As String Dim aa As String Dim bb As String Dim cc As Str ...

  9. C#开发ActiveX控件,.NET开发OCX控件案例 【转】

    http://xiaochen.2003.4.blog.163.com/blog/static/480409672012530227678/ 讲下什么是ActiveX控件,到底有什么作用?在网页中又如 ...

  10. mysql insert into 时报1062错误

    插入数据库时报1062错误,并没有错误详解 而网上的原因大多是主键重复,找了半天并没有解决办法 最后发现是表设置了联合唯一 ,插入的数据和之前的一样 >_< 太真实了