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. configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+.

    configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+. 一.错误发生情景: 在安装gcc时,执行.c ...

  2. BZOJ 4540 [Hnoi2016]序列 (单调栈 + ST表 + 莫队算法)

    题目链接  BZOJ4540 考虑莫队算法. 这题难在$[l, r]$到$[l, r+1]$的转移. 根据莫队算法的原理,这个时候答案应该加上 $cal(l, r+1) + cal(l+1, r+1) ...

  3. chattr&chown&cat&cut&useradd&passwd&chage&usermod

    1.用chattr命令防止系统中某个关键文件被修改 chattr +i /etc/resolv.conf chattr -i /etc/resolv.conf 要想修改此文件就要把i属性去掉 lsat ...

  4. Java 获取当前时间及实现时间倒计时功能

    引言 在一些项目中或是一些特殊的业务场景中,需要用到显示系统的当前时间,以及一些固定的时间倒计时,时间到后做一些什么事情的业务 .接下来咱们就具体看看代码是怎么实现的: <%@ page lan ...

  5. Java创建和解析Json数据方法(二)——org.json包的使用

    (二)org.json包的使用 1.简介   工具包org.json.jar,是一个轻量级的,JAVA下的json构造和解析工具包,它还包含JSON与XML, HTTP headers, Cookie ...

  6. GridControl 校验输入单元格格式 z

    // 对应的校验行事件,ValidateRow private void gv_FeeItem_ValidateRow(object sender, DevExpress.XtraGrid.Views ...

  7. sqlite数据库转换为mysql数据库

    SQLite工具我用的SQLiteStudio2.1.5 下载地址 http://sqlitestudio.pl/?act=download SQLiteStudio打开数据库文件,点工具->导 ...

  8. 浅谈拒绝服务攻击的原理与防御(4):新型DDOS攻击 – Websocket和临时透镜

    0×01 前言 前几天我已经分别发了三篇关于DDOS攻击相关的文章,我也是第一次在freebuf上发表这种文章,没想到有那么多人点击我真的很开心,前几天我为大家介绍的DDOS攻击的方法和原理都是已经出 ...

  9. SVN服务器配置说明 【转】

    http://www.cnblogs.com/ricksun/articles/1564905.html 1.前 言 花了72小时,终于把 Subversion 初步掌握了.从一个连“什么是版本控制” ...

  10. Linux图形界面和文字界面的切换

    Ctrl+Alt+F1~F6:切换到文字界面 登陆tty1~tty6终端, 运行等级为run level 3 Ctrl+Alt+F7 或者输入命令startX:切换到图形界面,运行等级为run lev ...