Qt 无边框可拖动圆角

本文详细介绍了如何在C++中使用Qt库实现一个无边框窗口,并处理鼠标按下、释放和移动事件,包括设置窗口属性、鼠标事件处理函数和自定义绘图事件。
摘要由CSDN通过智能技术生成

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); // 绘制圆角矩形

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值