qt自定义标题栏-qwidget应用实现双击、拖拽等功能


背景描述:

在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 }

 

  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM