博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt笔记之使用设计器自定义窗口标题栏
阅读量:6333 次
发布时间:2019-06-22

本文共 1927 字,大约阅读时间需要 6 分钟。

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

例如

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 
class TitleBarWidget : public QWidget{ Q_OBJECTpublic: 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 
TitleBarWidget::TitleBarWidget(QWidget *parent) : QWidget(parent) { }void TitleBarWidget::mousePressEvent(QMouseEvent *event){ QWidget *parentWidget = static_cast
(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
(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);}

 

转载于:https://www.cnblogs.com/buyishi/p/10306906.html

你可能感兴趣的文章
NFC·(近距离无线通讯技术)
查看>>
多线程基础(三)NSThread基础
查看>>
PHP的学习--Traits新特性
查看>>
ubuntu下,py2,py3共存,/usr/bin/python: No module named virtualenvwrapper错误解决方法
查看>>
Ext.form.field.Number numberfield
查看>>
Linux文件夹分析
查看>>
解决部分月份绩效无法显示的问题:timestamp\union al\autocommit等的用法
查看>>
nginx 域名跳转 Nginx跳转自动到带www域名规则配置、nginx多域名向主域名跳转
查看>>
man openstack >>1.txt
查看>>
linux几大服务器版本大比拼
查看>>
在BT5系统中安装postgresQL
查看>>
Can't connect to MySQL server on 'localhost'
查看>>
【Magedu】Week01
查看>>
写给MongoDB开发者的50条建议Tip25
查看>>
PostgreSQL学习手册(四) 常用数据类型
查看>>
为什么要让带宽制约云计算发展
查看>>
[iOS Animation]-CALayer 绘图效率
查看>>
2012-8-5
查看>>
VS中ProjectDir的值以及$(ProjectDir)../的含义
查看>>
我的友情链接
查看>>