使用QT 做一个类似VSCode的标题栏,自定义标题栏

目的,做一个如图的标题栏:
在这里插入图片描述
最终实现的效果图:
请添加图片描述

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QMouseEvent>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
    ,mouse_press(false)
{
    ui->setupUi(this);
    setWindowFlags(Qt::FramelessWindowHint);    // 设置窗口标志
    connect(ui->btnMin,&QPushButton::clicked,this,[=](){this->setWindowState(Qt::WindowMinimized);});
    connect(ui->btnMax,&QPushButton::clicked,this,[=](){
        if(this->isMaximized())this->setWindowState(Qt::WindowNoState);
        else this->setWindowState(Qt::WindowMaximized);
    });
    connect(ui->btnClose,&QPushButton::clicked,this,[=](){this->close();});

}

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

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    if(mouse_press&&!this->isMaximized()){
        move(event->globalPos() - mousePoint);
    }
}

void Widget::mousePressEvent(QMouseEvent *event)
{

    if( (event->button() == Qt::LeftButton) && ui->cMenuBar->geometry().contains(this->mapFromGlobal(QCursor::pos())) ){
        mouse_press = true;
        mousePoint = event->globalPos() - this->pos();
    }

}

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    mouse_press = false;
}

void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{
    if( (event->button() == Qt::LeftButton) && ui->cMenuBar->geometry().contains(this->mapFromGlobal(QCursor::pos())) ){
        if(this->isMaximized())this->setWindowState(Qt::WindowNoState);
        else this->setWindowState(Qt::WindowMaximized);
    }
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

protected:
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseDoubleClickEvent(QMouseEvent *event) override;

private:
    Ui::Widget *ui;

    QPoint mousePoint;
    bool mouse_press;
};
#endif // WIDGET_H

ui设计器:
在这里插入图片描述
有一个难点,那个QMenuBar是怎么添加到UI设计器中:
1.先添加一个QWidget,然后编译一下,退出UI设计器;
2.用文本编辑软件,打开UI设计文件,把QWidget手动修改为QMenuBar,保存文件;
3.再次进行ui设计器,原先的QWidget部件就变成了QMenuBar部件了,然后在进行布局
在这里插入图片描述


版权声明:本文为a_1_1_1_2原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。