欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt自定义标题栏并实现放大缩小和移动功能(包括鼠标双击)

程序员文章站 2022-07-13 23:02:39
...

首先重写mouseMoveEvent和mouseReleaseEvent事件,以及事件过滤器。

public:
//鼠标移动事件
void mouseMoveEvent(QMouseEvent *event);
//鼠标释放事件
void mouseReleaseEvent(QMouseEvent *event);
//事件过滤器
bool eventFilter(QObject *obj,QEvent *event);
//改变窗口大小
void turnView();

private:
//鼠标相对窗体的位置
QPoint m_pos;
//是否按下
bool m_bPressed;
//是否最大化
bool m_bMaxView;
//最大尺寸和上一次的尺寸
QRect m_maxRect,m_norRect;

然后在构造函数中为控件注册事件过滤器。并初始化变量。

m_bPressed = false;
m_bMaxView = false;
//注册自定义标题栏
ui->groupBox->installEventFilter(this);
//注册窗口自身
this->installEventFilter(this);
//获取电脑屏幕尺寸
m_maxRect = QApplication::desktop()->avaliableGeometry();

接下来实现重写的鼠标事件

void MainView::mouseMoveEvent(QMouseEvent *event)
{
    if(m_bPressed){
        if(m_bMaxView){
          //缩小到原先界面大小 
          setGeometry(m_maxRect.x(),m_maxRect.y(),m_norRect.width(),m_norRect.height());
          m_bMaxView = false;
        }
    }
 
    //鼠标相对电脑屏幕的位置,左上角为原点
    QPoint movePos = event->globalPos();
    QPoint pt(movePos - m_pos);
    
    //移动主窗体位置
    move(pt);
}
 
void MainView::mouseReleaseEvent(QMouseEvent *event)
{
    m_bPressed = false;
    event->ignore();
}

eventFilter 过滤事件

bool MainView::eventFilter(QObject *obj,QEvent *event)
{
    QMouseEvent * mouseEvent = static<QMouseEvent *>(event);
    if(obj == ui->groupBox){
        if(event->type() == QEvent::MouseButtonDbclick && mouseEvent->button() == Qt::LeftButton){
            turnView();
            return false;
        }
    }
    else if(obj == this){
        if(event->type() == QEvent::MouseButtonPress && mouseEvent->button() == Qt::LeftButton){
            m_bPressed = true;
            m_pos = mouseEvent->pos;
        
            return false;        
        }
    }

    return QObject::eventFilter(obj,event);
}
​

turnView 界面最大化和恢复正常

void MainView::turnView()
{
    if(m_bMaxView){
        setGeometry(m_norRect);    //设置为上一次大小
        m_bMaxView = false;
        return;
    }
    
    m_norRect = geometry();    //记录当前大小
    move(0,0);
    setGeometry(m_maxRect);    //最大化
    m_bMaxView = true;
}

就可以了。