Qt 去边框,去掉边框之后窗体移动,阴影,最大化和还原的实现

1、Qt去边框
构造函数中加上如下代码:
this->setWindowFlags(Qt::X11BypassWindowManagerHint | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);

2、去掉边框之后窗体移动
在.h文件中加上

#include
#include

protected:
void mousePressEvent(QMouseEvent *e);
void mouseMoveEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e);
QPoint last;

在.cpp上加上如下代码:

void Widget::mousePressEvent(QMouseEvent *e)
{
last = e->globalPos();
}

void Widget::mouseMoveEvent(QMouseEvent *e)
{
int dx = e->globalX() - last.x();
int dy = e->globalY() - last.y();
last = e->globalPos();
move(x()+dx, y()+dy);
}

void Widget::mouseReleaseEvent(QMouseEvent *e)
{
int dx = e->globalX() - last.x();
int dy = e->globalY() - last.y();
move(x()+dx, y()+dy);
}

3、阴影的实现

在.h中加如下代码:

#include

protected:
void paintEvent(QPaintEvent *event);
QPoint last;
int w = 10;

在.cpp加上如下代码:
构造函数中加上
setAttribute(Qt::WA_TranslucentBackground);

void Widget::paintEvent(QPaintEvent event) // 绘图
{
QPainterPath path;
path.setFillRule(Qt::WindingFill);
path.addRect( w, w, this->width()- w
2, this->height() - w*2 ); //

QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.fillPath(path, QBrush(Qt::white));

QColor color(0, 0, 0, 19);
for(int i=0; i<w; i++)
{
    QPainterPath path;
    path.setFillRule(Qt::WindingFill);
    path.addRect( w-i, w-i, this->width()-(w-i)*2, this->height()-(w-i)*2);
    color.setAlpha( 21 - qSqrt(i)*7);
    painter.setPen(color);
    painter.drawPath(path);
}

}

4、最大/还原的实现
1)在头文件加上如下代码
// 最大化/还原的标志
int Maxflag = 0; // 0 正常大小 1 最大化
2、在对应按钮的槽函数地方加上如下代码

Maxflag = 1 - Maxflag;
if( Maxflag == 0 )
{
    w = 10;   // 去掉虚边
    this->showNormal();
}
else if( Maxflag == 1 )
{
    w = 0;   // 去掉虚边
    this->showFullScreen();
}

实例代码:

.h的源码

#ifndef WIDGET_H
#define WIDGET_H

#include
#include
#include
#include

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
Q_OBJECT

public:
explicit Widget(QWidget *parent = nullptr);
~Widget();

protected:
void mousePressEvent(QMouseEvent *e);
void mouseMoveEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e);

void paintEvent(QPaintEvent *event);

private slots:
void on_pushButton_clicked();

void on_pushButton_2_clicked();

private:
Ui::Widget *ui;
QPoint last;
int w = 10;

//  最大化/还原的标志
int Maxflag = 0;    // 0 正常大小 1 最大化

};

#endif // WIDGET_H

.cpp的源码

#include “widget.h”
#include “ui_widget.h”

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);

this->setWindowFlags(Qt::X11BypassWindowManagerHint | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground);

}

Widget::~Widget()
{
delete ui;
}

void Widget::mousePressEvent(QMouseEvent *e)
{
last = e->globalPos();
}

void Widget::mouseMoveEvent(QMouseEvent *e)
{
int dx = e->globalX() - last.x();
int dy = e->globalY() - last.y();
last = e->globalPos();
move(x()+dx, y()+dy);
}

void Widget::mouseReleaseEvent(QMouseEvent *e)
{
int dx = e->globalX() - last.x();
int dy = e->globalY() - last.y();
move(x()+dx, y()+dy);
}

void Widget::paintEvent(QPaintEvent event) // 绘图
{
QPainterPath path;
path.setFillRule(Qt::WindingFill);
path.addRect( w, w, this->width()- w
2, this->height() - w*2 ); //

QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.fillPath(path, QBrush(Qt::white));

QColor color(0, 0, 0, 19);
for(int i=0; i<w; i++)
{
    QPainterPath path;
    path.setFillRule(Qt::WindingFill);
    path.addRect( w-i, w-i, this->width()-(w-i)*2, this->height()-(w-i)*2);
    color.setAlpha( 21 - qSqrt(i)*7);
    painter.setPen(color);
    painter.drawPath(path);
}

}

void Widget::on_pushButton_clicked()
{
Maxflag = 1 - Maxflag;
if( Maxflag == 0 )
{
w = 10; // 去掉虚边
this->showNormal();
}
else if( Maxflag == 1 )
{
w = 0; // 去掉虚边
this->showFullScreen();
}
}

void Widget::on_pushButton_2_clicked()
{
// 关闭窗体
this->close();
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值