QT5 自定义标题栏

先看效果图:

 完成的功能:最大化、最小化、关闭窗口、拖拽标题栏、标题栏圆角。

1)新建一个widget,名字为test1

2)mainwindow中建立一个pushbutton,让按下后弹出test1页面。

3)直接上代码

这是.h文件

#ifndef TEST1_H
#define TEST1_H

#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QScreen>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QMouseEvent>
#include <QDebug>

namespace Ui {
class test1;
}

class test1 : public QWidget
{
    Q_OBJECT

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

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

private slots:
    void Slot_btnMenu_Close_clicked();
    void Slot_btnMenu_Max_clicked();
    void Slot_btnMenu_Min_clicked();

private:
    Ui::test1 *ui;

    bool m_bmax;
    QRect m_location;

    bool TitleBar_LmousePressed;
    QPoint pressPoint;

    QLabel *lab_Title = new QLabel("页面1");
    QLabel *labelPic = new QLabel(); //标题栏LOGO
    QPushButton *btnMenu_Close = new QPushButton();
    QPushButton *btnMenu_Max = new QPushButton();
    QPushButton *btnMenu_Min = new QPushButton();

    QWidget *Widget_Title = new QWidget;//标题栏
    QWidget *Widget_content = new QWidget;//内容栏
};

#endif // TEST1_H

这是cpp文件

#include "test1.h"
#include "ui_test1.h"


test1::test1(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::test1)
{
    ui->setupUi(this);
    this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);//隐藏标题栏
    m_location = this->geometry();//保存默认尺寸
    m_bmax = false;//最大化变量赋初值
    TitleBar_LmousePressed = false;//标题栏拖拽变量赋初值

    QHBoxLayout *Hlay_menu = new QHBoxLayout;//标题栏
    QVBoxLayout *Vlay_main = new QVBoxLayout;//整体
    this->setLayout(Vlay_main);
    this->setStyleSheet("border-radius:5px;");//标题栏圆角
    this->setAttribute(Qt::WA_TranslucentBackground);
    Vlay_main->setMargin(0);
    Vlay_main->addWidget(Widget_Title);
    Widget_Title->setFixedHeight(30);
    Widget_Title->setContentsMargins(0,0,0,0);
    Widget_Title->setStyleSheet("background-color: rgba(56, 56, 56, 100%)");
    Vlay_main->addWidget(Widget_content);
    Widget_content->setStyleSheet("background-color: rgb(240, 250, 250)");
    Vlay_main->setStretch(0,1);
    Vlay_main->setStretch(1,10);
    Vlay_main->setSpacing(0);

    Widget_Title->setLayout(Hlay_menu);
    Hlay_menu->setContentsMargins(0,0,0,0);
    Hlay_menu->addWidget(labelPic);
    Hlay_menu->addWidget(lab_Title);
    Hlay_menu->addWidget(btnMenu_Min);
    Hlay_menu->addWidget(btnMenu_Max);
    Hlay_menu->addWidget(btnMenu_Close);
    labelPic->setFixedSize(20,20);
    labelPic->setStyleSheet("border-image: url(:/new/prefix1/temp/page_camera.png);border-radius:0px;");
    lab_Title->setStyleSheet("color:white");
    btnMenu_Min->setFixedSize(50,15);
    btnMenu_Min->setStyleSheet("border-image: url(:/new/prefix1/temp/min.png);border-radius:0px;");
    btnMenu_Max->setFixedSize(50,15);
    btnMenu_Max->setStyleSheet("border-image: url(:/new/prefix1/temp/max.png);border-radius:0px;");
    btnMenu_Close->setFixedSize(50,15);
    btnMenu_Close->setStyleSheet("border-image: url(:/new/prefix1/temp/close.png);border-radius:0px;");
    Hlay_menu->setStretch(0,1);
    Hlay_menu->setStretch(1,10);
    Hlay_menu->setStretch(2,1);
    Hlay_menu->setStretch(3,1);
    Hlay_menu->setStretch(4,1);

    connect(btnMenu_Max,&QPushButton::clicked,this,&test1::Slot_btnMenu_Max_clicked);
    connect(btnMenu_Min,&QPushButton::clicked,this,&test1::Slot_btnMenu_Min_clicked);
    connect(btnMenu_Close,&QPushButton::clicked,this,&test1::Slot_btnMenu_Close_clicked);
}

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

void test1::Slot_btnMenu_Max_clicked()
{
    if(m_bmax)
    {
        showNormal();
        m_bmax=false;
    }
    else
    {
        showMaximized();
        m_bmax = true;
    }

    qDebug()<<"max_click"<<m_bmax;
}

void test1::Slot_btnMenu_Min_clicked()
{
    showMinimized();
    qDebug()<<"min_click"<<m_bmax;
}

void test1::Slot_btnMenu_Close_clicked()
{
    this->close();
}

void test1::mouseMoveEvent(QMouseEvent *e)
{
    if(TitleBar_LmousePressed &&!m_bmax)  // 窗口最大化不移动
    {
        QPoint point=e->globalPos()-pressPoint;
        this->move(point);
    }
}

void test1::mousePressEvent(QMouseEvent *e)
{
    int maxWidth = this->width();
    int maxHeight = 30;   // 鼠标点击的有效高度 可根据实际适当调整
    if(e->button()==Qt::LeftButton)   // 设置鼠标左键点击才有效
    {
        if(e->pos().x()<=0 ||e->pos().x()>=maxWidth)
            return;
        if(e->pos().y()<=0 || e->pos().y()>=maxHeight)
            return;

        TitleBar_LmousePressed=true;
        pressPoint=e->globalPos()-this->pos();
    }
}

void test1::mouseReleaseEvent(QMouseEvent *)
{
    TitleBar_LmousePressed = false;
}


4)还有几个问题没处理。先留存

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值