移动无边框窗体的代码网上很多,其原理都是一样的,但是是有问题的,我这里只是对其修正一下

网上的代码仅仅实现了两个事件

  1. void EditDialog::mousePressEvent(QMouseEvent *event)
  2. {
  3. if (event->button() == Qt::LeftButton) {
  4. m_DragPosition = event->globalPos() - this->pos();
  5. event->accept();
  6. }
  7. }
  8. void EditDialog::mouseMoveEvent(QMouseEvent *event)
  9. {
  10. if (event->buttons() && Qt::LeftButton) {
  11. move(event->globalPos() - m_DragPosition);
  12. event->accept();
  13. }
  14. }

但是这样就会有一个问题,就是当鼠标在一个实现了mousePressEvent的类上点击时(比如QPushButton)会被该类优先处理此事件

而不会将事件传递到窗体的mousePressEvent中。继续,当移动鼠标到这个按钮外时(假设点在了QPushButton上)会触发窗体的mouseMoveEvent

从而导致计算坐标时发生错误,此时你就会看到窗体闪了一下,变动了位置,鼠标也没有停在前面按下的按钮之上。

解决办法也很简单,就是再多声明一个bool变量来判断,并实现mouseReleaseEvent即可

  1. void EditDialog::mousePressEvent(QMouseEvent *event)
  2. {
  3. if (event->button() == Qt::LeftButton) {
  4. m_Drag = true;
  5. m_DragPosition = event->globalPos() - this->pos();
  6. event->accept();
  7. }
  8. }
  9. void EditDialog::mouseMoveEvent(QMouseEvent *event)
  10. {
  11. if (m_Drag && (event->buttons() && Qt::LeftButton)) {
  12. move(event->globalPos() - m_DragPosition);
  13. event->accept();
  14. }
  15. }
  16. void EditDialog::mouseReleaseEvent(QMouseEvent *)
  17. {
  18. m_Drag = false;
  19. }

这样,就完成了无边框窗体的拖动。可是,这样做的效率并不高,因为鼠标每次move时都会触发事件,计算位置,移动窗口,重绘窗口……

当窗体上有QWebView部件时,特别是网页中有图片,Flash时,你就会发现用上面的方案去移动窗体时会非常不流畅。

如果不考虑跨平台,只针对Windows平台,那么我建议用Windows下的标准方法,模拟标题栏移动消息,既简单又高效

  1. void MainWindow::mousePressEvent(QMouseEvent *event)
  2. {
  3. if (ReleaseCapture())
  4. SendMessage(HWND(this->winId()), WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
  5. event->ignore();
  6. }

这样,在拖动窗体时只会在松开鼠标时才将窗体移动过去,这样就避免了第一种方法的低效率问题

http://blog.csdn.net/aqtata/article/details/8902889

最新文章

  1. wcf通过webHttpBinding方式发布rest web服务
  2. 基于theano的深度卷积神经网络
  3. 通过HttpClient方式连接网络
  4. php实现比较两个字符串日期大小的方法
  5. Standard Attachments in Oracle Form 标准附件
  6. Tolerance (定义发票允差)
  7. 跟我学android-Activity介绍
  8. LINUX下为LVM磁盘增加硬盘空间
  9. IE6下position:fixed不支持问题及其解决方式
  10. SpringMVC参数校验(针对`@RequestBody`返回`400`)
  11. vue 购物车练习
  12. sql server2008数据库复制实现数据同步常见问题
  13. python数据类型——数据转换
  14. SQL Server中获取指定时间段内的所有月份
  15. spring和springboot
  16. 手机服务器微架构设计与实现 之 http server
  17. Linux下开源邮件系统Postfix+Extmail+Extman环境部署记录
  18. swiper.js 多图片页面的懒加载lazyLoading
  19. Linux中Nginx安装与配置详解
  20. [LeetCode&Python] Problem 884. Uncommon Words from Two Sentences

热门文章

  1. 将字符串转换成xml并取得对应的值
  2. PDW中的Split Querying Process
  3. [Scikit-Learn] - 数据预处理 - 归一化/标准化/正则化
  4. CUDA+OpenCV 绘制朱利亚(Julia)集合图形
  5. Qt5.9 官方发布的新版本亮点的确不胜枚举(而且修复2000+ bugs)
  6. Android开发中如何加载API源码帮助开发
  7. uwp - 做一个相对炫酷的动画按钮/按钮动画
  8. wpf中的倒影效果实现
  9. ATS项目更新(1) CC视图与备份路径同步
  10. Spring Boot MyBatis 通用Mapper插件集成 good