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. fork()函数的执行过程、孤儿进程和僵尸进程

    说起fork就不得不提COW(Copy On Write),就是“写时拷贝”.也就是当fork发生时,子进程根本不会去拷贝父进程的内存页面,而是与父进程共享.当子进程或父进程需要修改一个内存页面时,L ...

  2. java mail Received fatal alert: handshake_failure java 无法发送邮件问题 java 发送qq邮件(含源码)

     java 无法发送邮件问题 java 发送qq邮件 报错:java mail Received fatal alert: handshake_failure (使用ssl) javax.mail.M ...

  3. (42)C#Stopwatch类(计算程序运行时间)

    引入命名空间 using System.Diagnostics; static void Main(string[] args) { Stopwatch sw = new Stopwatch(); s ...

  4. Debian9安装MariaDB

    一:导入密钥并添加了存储库 sudo apt-get install software-properties-common dirmngr sudo apt-key adv --recv-keys - ...

  5. Xamarin.Forms的相对布局RelativeLayout

    Xamarin.Forms的相对布局RelativeLayout   相对布局RelativeLayout是App中常用的布局方式.它是以界面中的某个元素为基准,设置另外一个元素的位置和大小.通过这种 ...

  6. 第三章 poj 1064——关于带精度的二分法

    /* 题意:给定n个实数l[i],给定一个k 问:求最大的ans,使得sum l[i]/ans i=1 to n >=k,且ans最大*/ #include <iostream> # ...

  7. BZOJ3270 博物館 概率DP 高斯消元

    BZOJ3270 博物館 概率DP 高斯消元 @(XSY)[概率DP, 高斯消元] Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博 ...

  8. DELPHI10.2的LINUX数据库开发环境配置

    DELPHI10.2的LINUX数据库开发环境配置 ubuntu使用firedac访问mysql1.安装mysql-client包sudo apt-get install mysql-client m ...

  9. oralce中相关的概念整理

    [数据库名]  概念:就是一个数据库的标识,作用等同于我们的身份证的作用,假设一台机器上安装了多个数据库,那么每一个数据库都会有一个数据库名称相应,这些数据库名称在数据库被创建的时候,数据库名称也会被 ...

  10. python pyqtgraph 保存图片到本地

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