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. phpcms V9 广告模块中广告模板修改

    广告模块模板位置 \phpcms\modules\poster\install\templates\*.html 我的需求: 去掉边框控制代码,是否显示边框我将在页面模板中设置,因些需要删除模板中的以 ...

  2. LeetCode OJ——Longest Valid Parentheses

    http://oj.leetcode.com/problems/longest-valid-parentheses/ 最大括号匹配长度,括号是可以嵌套的 #include <string> ...

  3. 使用 dotnet CLI 来打包和发布 .NET Core nuget package

    原文链接:使用 dotnet CLI 来打包和发布 .NET Core nuget package 如何使用 visual studio 2015/2017 打包和发布 Nuget package, ...

  4. Django中使用表单

    使用表单 表单用 user 提交数据,是网站中比较重要的一个内容 GET 和 POST 方法 GET 和 POST 的区别 URL,全称是"统一资源定位符".用于对应互联网上的每一 ...

  5. ML | Naive Bayes

    what's xxx In machine learning, naive Bayes classifiers are a family of simple probabilistic classif ...

  6. 缓存区溢出检测工具BED

    缓存区溢出检测工具BED   缓存区溢出(Buffer Overflow)是一类常见的漏洞,广泛存在于各种操作系统和软件中.利用缓存区溢出漏洞进行攻击,会导致程序运行失败.系统崩溃.渗透测试人员利用这 ...

  7. 补充==的使用和equals的区别

    字节码的比较     Class 相等与否使用“==” 进行比较,形如 if (adapter == IContentOutlinePage.class)  进行比较,因为字节码在JVM中只有一份,地 ...

  8. Java中将List转成逗号数组的方案

    说明:逗号字符串转成数组或者List都是可以的,反过来依然可行:但是如果是List<String>转List<Integer>,基本误解,在Java 7只能for循环,如果在J ...

  9. Android view 数据缓存

    Android中经常需要用到view数据的缓存,比如我们希望EditText 在被切到别的界面的时候,输入的数据要仍保持不变. 参考代码: /* 缓存textview */ public class ...

  10. python pyqtgraph 保存图片到本地

    pyqtgraph官方给的示例居然会报错2333 官方文档传送门:#####pyqtgraph export pyqtgraph支持在可视化窗口中右键保存(Exporting from the GUI ...