1. 演示视频
2.无边框代码
2.1 .H
添加一下头文件
#include <QMouseEvent>
/*--------------无边框全部参数---------------------*/private:
private:
#define MARGIN 5 // 拉伸窗口的点击距离
bool _isleftpressed = false; //判断是否是左键点击
bool _iswindowmove = false; //窗口是否移动
int _curpos = 0; //鼠标左键按下时光标所在区域
QPoint _plast; //获取鼠标左键按下时光标在全局(屏幕而非窗口)的位置
int countRow(QPoint p);
int countFlag(QPoint p, int row);
void Borderless_Init();
void setCursorType(int flag);
void System_Prompt();
bool event(QEvent *e);
void paintEvent(QPaintEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
2.2 .CPP
构造函数初始化
this->setWindowFlags(Qt::FramelessWindowHint); //设置为无边框窗口
this->setAttribute(Qt::WA_TranslucentBackground); //设置为透明
下面所有的函数只需要移植到工程就行了
/*===========================================无边框初始化==================================================*/
//鼠标按下事件
/*
*作用:
*1.判断是否时左键点击 _isleftpressed
*2.获取光标在屏幕中的位置 _plast
*3.左键按下时光标所在区域 _curpos
*/
void MainWindow::mousePressEvent(QMouseEvent *event)
{
Q_UNUSED(event);
if ((event->button() == Qt::LeftButton) && (event->pos().y() < ui->line->geometry().topLeft().y()))
this->_iswindowmove = true;
else
this->_iswindowmove = false;
if (event->button() == Qt::LeftButton)
{
this->_isleftpressed = true;
QPoint temp = event->globalPos();
_plast = temp;
_curpos = countFlag(event->pos(), countRow(event->pos()));
}
}
//鼠标释放事件
/*
*作用:
*1.将_isleftpressed 设为false
*2.将光标样式恢复原样式 setCursor(Qt::ArrowCursor);
*/
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
Q_UNUSED(event);
if (_isleftpressed)
_isleftpressed = false;
setCursor(Qt::ArrowCursor);
}
bool MainWindow::event(QEvent *e)
{
//鼠标移动事件
if(QEvent::HoverMove == e->type())//鼠标移动
{
QHoverEvent *hoverEvent = dynamic_cast<QHoverEvent*>(e);
if(hoverEvent)
{
QPoint pos = hoverEvent->pos();
if(this->isFullScreen()) return QWidget::event(e);
int poss = countFlag(pos, countRow(pos));
setCursorType(poss);
if (_isleftpressed)//是否左击
{
QPoint ptemp = QCursor::pos();
ptemp = ptemp - _plast;
if ((_curpos == 22) && (_iswindowmove))//移动窗口,并且点到了置顶的位置区域
{
ptemp = ptemp + QWidget::pos();
move(ptemp);
}
else
{
QRect wid = geometry();
switch (_curpos)//改变窗口的大小
{
case 11:wid.setTopLeft(wid.topLeft() + ptemp); break;//左上角
case 13:wid.setTopRight(wid.topRight() + ptemp); break;//右上角
case 31:wid.setBottomLeft(wid.bottomLeft() + ptemp); break;//左下角
case 33:wid.setBottomRight(wid.bottomRight() + ptemp); break;//右下角
case 12:wid.setTop(wid.top() + ptemp.y()); break;//中上角
case 21:wid.setLeft(wid.left() + ptemp.x()); break;//中左角
case 23:wid.setRight(wid.right() + ptemp.x()); break;//中右角
case 32:wid.setBottom(wid.bottom() + ptemp.y()); break;//中下角
}
setGeometry(wid);
}
_plast = QCursor::pos();//更新位置
}
}
}
return QWidget::event(e);
}
//获取光标在窗口所在区域的 列 返回行列坐标
int MainWindow::countFlag(QPoint p,int row)//计算鼠标在哪一列和哪一行
{
if(p.y()<MARGIN)
return 10+row;
else if(p.y()>this->height()-MARGIN)
return 30+row;
else
return 20+row;
}
//获取光标在窗口所在区域的 行 返回行数
int MainWindow::countRow(QPoint p)
{
return (p.x()<MARGIN) ? 1 : (p.x()>(this->width() - MARGIN) ? 3 : 2);
}
//根据鼠标所在位置改变鼠标指针形状
void MainWindow::setCursorType(int flag)
{
switch(flag)
{
case 11:
case 33:
setCursor(Qt::SizeFDiagCursor);break;
case 13:
case 31:
setCursor(Qt::SizeBDiagCursor);break;
case 21:
case 23:
setCursor(Qt::SizeHorCursor);break;
case 12:
case 32:
setCursor(Qt::SizeVerCursor);break;
case 22:
setCursor(Qt::ArrowCursor);
QApplication::restoreOverrideCursor();//恢复鼠标指针性状
break;
}
}
/**
* @brief 重写绘图事件
* @retval None
*/
void MainWindow::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true); // 设置抗锯齿
painter.setBrush(QColor(62, 62, 74)); // 设置窗口颜色和透明度
// 创建线性渐变色
// QLinearGradient gradient(0, 0, 0, this->height());
// gradient.setColorAt(0, QColor(62, 62, 74)); // 起始颜色
// gradient.setColorAt(1, QColor(9, 39, 75)); // 终止颜色
// painter.setBrush(gradient);
painter.setPen(Qt::NoPen); // 不绘制边框
//是最大化
if(isMaximized())
painter.drawRoundedRect(0, 0, this->width(), this->height(), 0, 0); // 绘制圆角矩形
else
painter.drawRoundedRect(0, 0, this->width(), this->height(), 15, 15); // 绘制圆角矩形
}
/*===========================================无边框初始化==================================================*/
如果是不需要渐变色的话就知己删除以下代码
// 创建线性渐变色
QLinearGradient gradient(0, 0, 0, this->height());
gradient.setColorAt(0, QColor(245, 245, 247)); // 起始颜色
gradient.setColorAt(1, QColor(240, 239, 238)); // 终止颜色
编辑边框圆角大小只需要改变后面两个参数就可以了
painter.drawRoundedRect(0, 0, this->width(), this->height(), 10, 10); // 绘制圆角矩形