【Qt】自定义标题栏并实现鼠标拖拽移动

1.Qt在windows下变成,标题栏归系统管理器管理。想要自定义就只能把原来的隐藏掉,然后自己添加组件,自己做;

2.首先设置属性,隐藏掉原来的标题栏: 

    /* 标题栏样式 */
    this->setWindowFlags(Qt::FramelessWindowHint |
                         Qt::WindowSystemMenuHint |
                         Qt::WindowMinMaxButtonsHint);

3.重写鼠标的三个事件,分别是:

    /* custom title bar */
    void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
    void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
    void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE;

4.代码如下:

void MainWindow::mousePressEvent(QMouseEvent *event)
{

    if( event->button() == Qt::LeftButton &&
            ui->frame_title_bar->frameRect().contains(event->globalPos() - this->frameGeometry().topLeft())){
        m_Press = event->globalPos();
        leftBtnClk = true;
    }
    event->ignore();//表示继续向下传递事件,其他的控件还可以去获取
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{

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

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    if( leftBtnClk ){
        m_Move = event->globalPos();
        this->move( this->pos() + m_Move - m_Press );
        m_Press = m_Move;
    }
    event->ignore();
}

5.注意事项:

1)通过frame.frameRect().contains 可以判断鼠标位置是否在自定义的标题栏上;但是这里传入的位置是以MainWindow的左上角为原点的;

所以使用的是 

event->globalPos() - this->frameGeometry().topLeft()

来得到该坐标;

2)窗口移动直接使用move() ; 里面参数是:

this->pos() + m_Move - m_Press

逻辑上也很好理解,现在的窗口位置 + (  鼠标现在位置 -  鼠标原来位置 ); 不要忘记去更新鼠标的原来位置 m_Press = m_Move;

3) 最后的 event->ignore(); 保证该鼠标事件可以继续传递下去,以便其他控件可以继续处理。因为标题栏是在主窗口上面的,所以event会先传给标题栏,然后如果没有被接受才会传给主窗口。


版权声明:本文为u010352603原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>