Qt笔记(四十五)之Qt自定义标题栏

104 篇文章 127 订阅
本文介绍了如何在Qt中实现自定义标题栏,以确保样式统一。通过隐藏系统标题栏,捕获鼠标事件来实现窗口移动,并添加最大化、最小化和关闭功能。双击标题栏可实现窗口的最大化与恢复。提供的代码示例详细展示了实现过程。
摘要由CSDN通过智能技术生成

一.前言
Qt采用系统的标题栏,会发现使用Qss的时候,标题栏是没有被渲染到的,这个时候就需要用到自定义标题栏了,楼主一开始也正是为了这一目的,保证样式的统一,故楼主就此做一个记录分享

二.实现过程
1.整体思路
》隐藏系统标题栏
》捕捉鼠标点击事件 移动事件以及释放事件
》坐标的计算
当鼠标在窗体的标题栏按下并移动时,窗体会按照鼠标移动的轨迹进行平移。因此,窗体每次移动都是在当前位置按照鼠标移动的矢量进行移动。
MouseEvent中的globalPos()函数返回的是相对屏幕的位置坐标,而pos()则是返回鼠标在当前控件(即捕获该鼠标事件的控件)中的位置

2.核心代码

void MyTitleBar::mousePressEvent(QMouseEvent *e)
{
    int maxWidth = this->width();
    int maxHeight = 35;   // 鼠标点击的有效高度 可根据实际适当调整
    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;

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

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

void MyTitleBar::mouseReleaseEvent(QMouseEvent)
{
    mousePress=false;
}

3.增加最大化/最小化/关闭 双击标题栏最大化/恢复功能

void MyTitleBar::on_pushButton_1_clicked()
{
    showMinimized();
}

void MyTitleBar::on_pushButton_2_clicked()
{
    if(max)
    {
        showNormal();
        max=false;
        ui->pushButton_2->setText("最大化");
    }
    else
    {
        showMaximized();
        max = true;
        ui->pushButton_2->setText("恢复");
    }
}

void MyTitleBar::on_pushButton_3_clicked()
{
    close();
}

void MyTitleBar::mouseDoubleClickEvent(QMouseEvent *e)
{
    if(e->button()==Qt::LeftButton)   // 设置鼠标左边双击才有用
    {
        if(max)
        {
            showNormal();
            max=false;
            ui->pushButton_2->setText("最大化");
        }
        else
        {
            showMaximized();
            max = true;
            ui->pushButton_2->setText("恢复");
        }
    }
}

4.预览
在这里插入图片描述

源码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值