Qt自定义标题栏并实现界面放大缩小和移动功能

首先重写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;
}

就可以了。

发布了133 篇原创文章 · 获赞 175 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/c_shell_python/article/details/101518575