Qt隐藏框架的窗口部件的移动事件处理
来源:互联网 发布:纸介阅读与网络阅读 编辑:程序博客网 时间:2024/05/22 18:23
问题描述:
我们的自定义的Qt窗口,大多采用了隐藏框架、然后自定义窗口标题栏的方式,实现了窗口的定制。但是在测试、使用过程中,经常出现拖动非标题栏位置窗口也跟着移动、甚至跳动的现象。
解决方案:
重写窗口部件的三个事件函数,mousePressEvent,mouseMoveEvent,mouseReleaseEvent。
在窗口类的内部定义一个记录鼠标按下位置的QPoint m_mousePressPoint;默认值是一个y值大于窗口标题栏高度的点,可设置为QPoint(0,100)。
在mousePressEvent事件中,判断是否是左键按下,若是,则记录鼠标按下的点,并获取鼠标按下时所在位置的窗口部件,并对鼠标按下的点重新定位:若鼠标按下点所在的窗口部件是标题栏内部的窗口部件,则按下点保持不变,否则,将按下点置为默认值。
在mouseMoveEvent事件中,通过按下点的位置与标题栏高度的对比,决定是否执行移动操作。若按下点的位置小于标题栏高度,则移动,否则不移动。(为了避免由于标题栏的部件的边界区域宽度较大时,造成拖动标题栏下边缘无效的情况发生,要考虑标题栏窗口部件相对于其父窗口(this)的相对位置)
在mouseReleaseEvent事件中,将按下点恢复到默认值(因为点击combobox后,不触发mousePressEvent,所以不会对按下点设置位置,而是保持上次的值,因此可能导致移动事件判断出错)。
参考代码如下:
QPoint SubstationAlarmDlg::m_mousePressPoint;//定义记录鼠标按下点。void SubstationAlarmDlg::mousePressEvent(QMouseEvent* event){if(event->button()==Qt::LeftButton)//判断是否是左键点击{m_mousePressPoint = event->pos();QWidget *tempWidget = childAt(m_mousePressPoint);if (tempWidget == ui.label_5 ||tempWidget == ui.titlelabel ||tempWidget == ui.closeBtn||tempWidget == ui.label_2 ||tempWidget == ui.label_4 ||tempWidget == ui.label_6||tempWidget == ui.label ) //(不包含最大化、最小化、还原、关闭按钮){;//判断按下点所处的部件是否为标题栏内的窗口部件,若是,不作为。}else{m_mousePressPoint = QPoint(0,100);//若不是,重置为初始值。}}}void SubstationAlarmDlg::mouseMoveEvent(QMouseEvent *event){QPoint tempPoint = event->pos();//获取事件发生位置QRect selfRect = ui.logoWidget->geometry();//获取窗口图标相对于父窗体的矩形int y = selfRect.y();//获取矩形的高度int tempHight = ui.logoWidget->height() + y;//获取标题栏最下线到父窗体最上线的距离(作为判断对比值)if (m_mousePressPoint.y() < tempHight)//对比,确定是否移动。{int tempX = tempPoint.x() - m_mousePressPoint.x();int tempY = tempPoint.y() - m_mousePressPoint.y();int nowX = this->x();int nowY = this->y();nowX += tempX;nowY += tempY;this->move(nowX, nowY);}}void SubstationAlarmDlg::mouseReleaseEvent(QMouseEvent *event){m_mousePressPoint = QPoint(0, 100);}
0 0
- Qt隐藏框架的窗口部件的移动事件处理
- Qt隐藏系统的窗口框架后如何移动窗口,如何改变其大小?
- qt窗口部件的布局
- QT -- 窗口部件的布局
- QT常见的窗口部件
- QT 隐藏标题栏 窗口移动 鼠标事件
- QT入门笔记--窗口部件的布局
- qt 中窗口以及窗口部件背景图案的设置
- Qt提升子部件的办法&如何重写提升后部件的事件处理函数
- QT中 窗口部件的 背景图片 的设置
- QT中 窗口部件的 背景图片 的设置
- QT中 窗口部件的 背景图片 的设置
- QT中 窗口部件的 背景图片 的设置
- QT中 窗口部件的 背景图片 的设置
- QT中 窗口部件的 背景图片 的设置
- Qt教程4-使用用户自定义的窗口部件
- QT内置的窗口部件类和对话框类
- 第一章-Qt入门 1.3 窗口部件的布局
- ms project2007 介绍
- Linux 监控网络状态信息
- magent+memcached && centos 开放11212端口
- 配置文件灵活配置
- HDOJ 5137 How Many Maos Does the Guanxi Worth 枚举+Dijkstra
- Qt隐藏框架的窗口部件的移动事件处理
- 对九大速算方法的统一
- JDK在Window与Linux环境下的安装与环境配置
- const用法补充
- 【管理心得之三十四】“禅宗境界”的员工
- java.lang.SecurityException:under uid 10090 but it is really 10060
- #ifndef #define #endif
- Web服务器性能/压力测试工具http_load、webbench、ab、Siege使用教程
- MINA源码分析---心跳包过滤器KeepAliveFilter