Qt实现自定义标题栏,鼠标拖动窗口移动

⌚Time: 2023-03-12 23:30:42

👨‍💻Author: Jack Ge

布局

实现自定义标题栏,首先取消系统标题栏


//取消系统标题栏

setWindowFlag(Qt::FramelessWindowHint);

窗体放入两个widget,一个作为标题栏,另一个作为窗体显示内容

对于标题widget1,右键设置样式表,添加一个背景色

向widget1添加一个label,两个按钮,右键布局,设置为水平布局

对于两个按钮,属性中设置它们的最大宽度40

widget2添加一个测试标签

对于窗体右键,布局,垂直布局

标题栏太高,设置属性最大高度40

运行程序

对于窗体中的centralwidget,设置它的属性边距宽度,LeftMargin、TopMargin、RightMargin、BottomMargin都为0,widget与窗体无空白

widget1的左右边距宽度都为9,控件与widget左右边缘空白

导入图标

在项目文件夹下建立resource目录,导入最小化和关闭等图标,文件,新建,Qt Resource File导入它们

执行qmake

对于标题栏按钮,属性中设置空文本

选择导入的图标

标题栏按钮,设置样式表,背景透明

效果

鼠标拖动




#include <QMouseEvent>

窗体类头文件


    //鼠标拖动窗体移动

    void mousePressEvent(QMouseEvent *event);

    void mouseMoveEvent(QMouseEvent *event);

    void mouseReleaseEvent(QMouseEvent *event);

    bool        m_bDrag;

    QPoint      mouseStartPoint;

    QPoint      windowTopLeftPoint;


源文件




//实现鼠标拖拽移动

void MainWindow::mousePressEvent(QMouseEvent *event)

{

    if(event->button() == Qt::LeftButton)

    {

        m_bDrag = true;

        //获得鼠标的初始位置

        mouseStartPoint = event->globalPos();

        //mouseStartPoint = event->pos();

        //获得窗口的初始位置

        windowTopLeftPoint = this->frameGeometry().topLeft();

    }

}



void MainWindow::mouseMoveEvent(QMouseEvent *event)

{

    if(m_bDrag)

    {   //这里if语句判断,让鼠标在特定控件上进行拖动才有效,比如自绘标题栏控件

        if(!ui->label->underMouse()){

            return;

        }

        //获得鼠标移动的距离

        QPoint distance = event->globalPos() - mouseStartPoint;

        //QPoint distance = event->pos() - mouseStartPoint;

        //改变窗口的位置

        this->move(windowTopLeftPoint + distance);

    }

}



void MainWindow::mouseReleaseEvent(QMouseEvent *event)

{

    if(event->button() == Qt::LeftButton)

    {

        m_bDrag = false;

    }

}




按钮功能

通过信号槽绑定最小化和关闭按钮的功能函数


connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(showMinimized()));

connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(close()));

效果