QT自绘标题栏,可拖动

#include "topwidget.h"
#include <QGridLayout>
#include <QDebug>
#include <QMouseEvent>
#pragma execution_character_set("utf-8")
TopWidget::TopWidget(QWidget *parent ) : QWidget(parent)
{
    //初始化界面
    this->resize(1200, 25);
    m_parent = parent;
    m_titleLabel = new QLabel(this);
    m_minButton = new QToolButton(this);
    m_maxButton = new QToolButton(this);
    m_closeButton = new QToolButton(this);
    m_minButton->setText("min");
    m_maxButton->setText("max");
    m_closeButton->setText("close");
    m_titleLabel->setText("检码参数界面");
    
    //获取最小化、关闭按钮图标
    QPixmap minPix = style()->standardPixmap(QStyle::SP_TitleBarMinButton);
    QPixmap maxPix = style()->standardPixmap(QStyle::SP_TitleBarMaxButton);
    QPixmap closePix = style()->standardPixmap(QStyle::SP_TitleBarCloseButton);
    
    //设置图标
    m_minButton->setIcon(minPix);
    m_maxButton->setIcon(maxPix);
    m_closeButton->setIcon(closePix);
    
    //设置鼠标移至按钮上的提示信息
    m_minButton->setToolTip(tr("最小化"));
    m_closeButton->setToolTip(tr("关闭"));
    m_maxButton->setToolTip(tr("最大化"));

    //设置最小化、关闭按钮的样式
    this->setStyleSheet("background-color:white;");
    m_minButton->setStyleSheet("QToolButton{background-color:transparent}"
                              "QToolButton:hover{background-color:rgba(0,197,205,100)}"
                              "QToolButton:pressed{background-color:rgba(0,134,139,100)}");
    m_maxButton->setStyleSheet("QToolButton{background-color:transparent}"
                              "QToolButton:hover{background-color:rgba(0,197,205,100)}"
                              "QToolButton:pressed{background-color:rgba(0,134,139,100)}");
    m_closeButton->setStyleSheet("QToolButton{background-color:transparent}"
                              "QToolButton:hover{background-color:rgba(0,197,205,100)}"
                              "QToolButton:pressed{background-color:rgba(0,134,139,100)}");
    
    //布局
    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->addWidget(m_titleLabel, 0, 0, 1, 15);
    mainLayout->addWidget(m_minButton, 0, 15);
    mainLayout->addWidget(m_maxButton, 0, 16);
    mainLayout->addWidget(m_closeButton, 0, 17);
    this->setLayout(mainLayout);
    this->setMouseTracking(true);
    m_bLeftBtnClk = false;
    
    //关联信号槽
    connect(m_closeButton, &QToolButton::clicked, this, &TopWidget::WindowClosed);
    connect(m_minButton, &QToolButton::clicked, this, &TopWidget::WindowMin);
    connect(m_maxButton, &QToolButton::clicked, this, &TopWidget::WindowMax);
}

void TopWidget::SetParentWidget(QWidget *parent)
{
    m_parent = parent;
    this->setParent(this);
}


void TopWidget::WindowClosed()
{
    m_parent->close();
}

void TopWidget::WindowMin()
{
    m_parent->showMinimized();
}

void TopWidget::WindowMax()
{
    //m_parent->showMaximized();
    m_parent->showNormal();
}

void TopWidget::SetTitle(QString *title, QPixmap *pix)
{
    m_titleLabel->setText(*title);
    m_titleLabel->setPixmap(*pix);
}


void TopWidget::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        m_Press = event->globalPos();
        m_bLeftBtnClk = true;
    }
    event->ignore();//表示继续向下传递事件,其他的控件还可以去获取
}

void TopWidget::mouseReleaseEvent(QMouseEvent *event)
{

    if( event->button() == Qt::LeftButton )
    {
        m_bLeftBtnClk = false;
    }
    event->ignore();
}

void TopWidget::mouseMoveEvent(QMouseEvent *event)
{
    if( m_bLeftBtnClk ){
        m_Move = event->globalPos();
        m_parent->move(m_parent->pos() + m_Move - m_Press);
        m_Press = m_Move;
    }
    event->ignore();
}

```cpp

应用端

//参数界面布局
    m_gridLayout->addWidget(m_leftWidget, 0, 0, 10, 1);
    m_gridLayout->addWidget(m_midWidget, 0, 1, 10, 1);
    m_gridLayout->addWidget(m_rightWidget, 0, 2, 10, 1);
    m_gridLayout->addWidget(m_lbottomWidget, 10, 0, 2, 2);
    m_gridLayout->addWidget(m_rbottomWidget, 10, 2, 2, 1);
    m_mainWidget->setLayout(m_gridLayout);
    //界面整体布局
    m_mainLayout->addWidget(m_topWidget, 0, 0, 2, 1);
    m_mainLayout->addWidget(m_mainWidget, 2, 0, 12, 1);
    m_mainLayout->setMargin(0);
    this->setLayout(m_mainLayout);
    //隐藏自身标题栏
    this->setWindowFlags(Qt::FramelessWindowHint);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值