背景描述:
在qt下做了一个界面,原标题栏应用时,无法添加左上角图标,因此自定义了一个标题栏,添加一个qwidget代替。
解决问题:
为了省事,没有新建title类,直接在mainwindow添加了qwidget,所以处理鼠标事件时,需要对鼠标位置进行额外的判断处理,只有当前鼠标事件的位置在widget_title的范围内,才进行事件的处理。
界面描述:
标题栏:widget_title
菜单栏:widget_menu (在widget_title下方)
代码实现:
重写mouseDoubleClickEvent、mousePressEvent、mouseMoveEvent三个事件处理函数
头文件里:
1 // 双击标题栏 2 virtual void mouseDoubleClickEvent(QMouseEvent *event); 3 // 点击标题栏 4 virtual void mousePressEvent(QMouseEvent *event); 5 // 拖动标题栏 6 virtual void mouseMoveEvent(QMouseEvent *event);
cpp里实现
1 void MainWindow::mouseDoubleClickEvent(QMouseEvent *event) 2 { 3 4 int l_titleY = mapToGlobal(ui->widget_title->pos()).y(); 5 int l_menuY = mapToGlobal(ui->widget_menu->pos()).y(); 6 int l_mouseY = event->globalPos().y(); 7 // 判断鼠标位置 8 if(l_mouseY > l_titleY && l_mouseY < l_menuY) 9 { 10 if(m_bIsMaxWindow)//判断当前窗口状态,自己添加实现即可,简单 11 { 12 showNormal(); 13 } 14 else 15 { 16 showMaximized(); 17 } 18 } 19 } 20 21 void MainWindow::mousePressEvent(QMouseEvent *event) 22 { 23 int l_titleY = mapToGlobal(ui->widget_title->pos()).y(); 24 int l_menuY = mapToGlobal(ui->widget_menu->pos()).y(); 25 int l_mouseY = event->globalPos().y(); 26 if (event->button() == Qt::LeftButton && l_mouseY > l_titleY && l_mouseY < l_menuY) //点击左边鼠标 27 { 28 m_dragPosition = event->globalPos() - frameGeometry().topLeft(); 29 //globalPos()获取根窗口的相对路径,frameGeometry().topLeft()获取主窗口左上角的位置 30 event->accept(); //鼠标事件被系统接收 31 } 32 33 } 34 35 void MainWindow::mouseMoveEvent(QMouseEvent *event) 36 { 37 int l_titleY = mapToGlobal(ui->widget_title->pos()).y(); 38 int l_menuY = mapToGlobal(ui->widget_menu->pos()).y(); 39 int l_mouseY = event->globalPos().y(); 40 if (event->buttons() == Qt::LeftButton && l_mouseY > l_titleY && l_mouseY < l_menuY) //当满足鼠标左键被点击时。 41 { 42 move(event->globalPos() - m_dragPosition);//移动窗口 43 event->accept(); 44 } 45 }