简述

通过前两节内容,我们实现了自定义窗体的移动,以及自定义标题栏-用来显示窗体的图标、标题,以及控制窗体最小化、最大化、关闭。

在这之后,我们还缺少窗体的缩放-当鼠标移动到窗体的边框-左、上、右、下、左上角、左下角、右上角、右下角时候,鼠标变为相应的样式,并且窗体可以随着鼠标拖动而进行放大、缩小。

效果

窗体缩放

实现

包含头文件与需要用到的库

  1. #ifdef Q_OS_WIN
  2. #include <qt_windows.h>
  3. #include <Windowsx.h>
  4. #endif

使用nativeEvent进行窗体缩放

  1. bool Widget::nativeEvent(const QByteArray &eventType, void *message, long *result)
  2. {
  3. Q_UNUSED(eventType)
  4. MSG *param = static_cast<MSG *>(message);
  5. switch (param->message)
  6. {
  7. case WM_NCHITTEST:
  8. {
  9. int nX = GET_X_LPARAM(param->lParam) - this->geometry().x();
  10. int nY = GET_Y_LPARAM(param->lParam) - this->geometry().y();
  11. // 鼠标区域位于标题栏按钮之上,则不进行处理
  12. QList<QPushButton *> buttons = m_pTitleBar->findChildren<QPushButton *>();
  13. foreach (QPushButton *pButton, buttons)
  14. {
  15. if (pButton->geometry().contains(QPoint(nX, nY)))
  16. {
  17. *result = HTCLIENT;
  18. return true;
  19. }
  20. }
  21. // 鼠标区域位于标题栏中,进行移动
  22. if (nX >= m_nBorder && nX <= this->width() - m_nBorder
  23. && nY >= m_nBorder && nY <= m_pTitleBar->height())
  24. {
  25. *result = HTCAPTION;
  26. return true;
  27. }
  28. // 鼠标区域位于窗体边框,进行缩放
  29. if ((nX > 0) && (nX < m_nBorder))
  30. *result = HTLEFT;
  31. if ((nX > this->width() - m_nBorder) && (nX < this->width()))
  32. *result = HTRIGHT;
  33. if ((nY > 0) && (nY < m_nBorder))
  34. *result = HTTOP;
  35. if ((nY > this->height() - m_nBorder) && (nY < this->height()))
  36. *result = HTBOTTOM;
  37. if ((nX > 0) && (nX < m_nBorder) && (nY > 0)
  38. && (nY < m_nBorder))
  39. *result = HTTOPLEFT;
  40. if ((nX > this->width() - m_nBorder) && (nX < this->width())
  41. && (nY > 0) && (nY < m_nBorder))
  42. *result = HTTOPRIGHT;
  43. if ((nX > 0) && (nX < m_nBorder)
  44. && (nY > this->height() - m_nBorder) && (nY < this->height()))
  45. *result = HTBOTTOMLEFT;
  46. if ((nX > this->width() - m_nBorder) && (nX < this->width())
  47. && (nY > this->height() - m_nBorder) && (nY < this->height()))
  48. *result = HTBOTTOMRIGHT;
  49. return true;
  50. }
  51. }
  52. return QWidget::nativeEvent(eventType, message, result);
  53. }

接口说明

Qt5与Qt4其中的一个区别就是用nativeEvent代替了winEvent。

nativeEvent主要用于进程间通信-消息传递。在这里我们主要进行窗体缩放,其中还添加了一些限制,比如:

  1. 鼠标区域位于标题栏按钮之上,则不进行处理。
  2. 鼠标区域位于标题栏中,进行移动。

使用这种方式后,窗体就可以随意缩放了,而且可以去掉标题栏中控制界面移动的代码-在mousePressEvent中使用SendMessage来进行移动。

当然,这种实现只能在Windows下使用,因为用的是Win API,如果需要跨平台的话,需要自己处理各种事件,而且得考虑的很全面。


  1. 原文作者:一去丶二三里
    作者博客:去作者博客空间

【Qt】Qt之自定义界面(窗体缩放)【转】的更多相关文章

  1. 【Qt】Qt之自定义界面(窗体缩放-跨平台终极版)【转】

    简述 通过上一节内容,我们实现了窗体的缩放,功能很不错,但是很遗憾-不支持跨平台!如果对于多平台来说,这是一个硬伤,所以,我们急需要一个能够支持跨平台的实现方案. 在网上看到过很多不同的实现方式,多多 ...

  2. Qt之自定义界面(窗体缩放-跨平台终极版)

    简述 通过上一节内容,我们实现了窗体的缩放,功能很不错,但是很遗憾-不支持跨平台!如果对于多平台来说,这是一个硬伤,所以,我们急需要一个能够支持跨平台的实现方案. 在网上看到过很多不同的实现方式,多多 ...

  3. Qt之自定义界面(窗体缩放)

    简述 通过前两节内容,我们实现了自定义窗体的移动,以及自定义标题栏-用来显示窗体的图标.标题,以及控制窗体最小化.最大化.关闭. 在这之后,我们还缺少窗体的缩放-当鼠标移动到窗体的边框-左.上.右.下 ...

  4. pyqt5对用qt designer设计的窗体实现弹出子窗口的示例

    pyqt5对用qt designer设计的窗体实现弹出子窗口的示例 脚本专栏 python 1. 用qt designer编写主窗体,窗体类型是MainWindow,空白窗口上一个按钮.并转换成mai ...

  5. Qt... configure: error: Qt (>= Qt 2.2.2) (headers…

    转载:http://blog.chinaunix.net/uid-23733724-id-290980.html     昨天开始在自己的fedora12下装qt~ 但是按照教程在/opt/Embed ...

  6. Qt, QT/E, Qtopia 的区别

    转自Qt, QT/E, Qtopia 的区别 Qt泛指Qt的所有桌面版本,比如Qt/X11,Qt Windows,Qt Mac等.由于Qt最早是在Linux中随着KDE流行开来的,因此通常很多人说的Q ...

  7. QT QT creator QTsdk的区别

    Qt是一个跨平台的C++图形用户界面应用程序框架.它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能.Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程. QT Creator 跨平台 ...

  8. C#winform 窗体缩放自适应

    1.  首先在窗体上放上一个Panel容器,并将容器的Dock属性设为Fill,即所有的控件都放在了这个容器里. using System; using System.Collections.Gene ...

  9. QT,QT SDK, QT Creator 区别

    Qt是一个跨平台的C++图形用户界面应用程序框架.(不仅仅是C++,还包括QML,Qquick,html5)它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能.Qt是完全面向对象的,很容易扩 ...

随机推荐

  1. How to setup ELM327 Bluetooth WiFi for Android software Torque

    1.    Install OBDII 2.    Install Android Software Torque a)    Copy software to phone from CD b)   ...

  2. Unity3D 使用脚本来控制 UI 的 Image 显示的图片。

    记录一下这个问题. 原文地址:http://tieba.baidu.com/p/3561719701 object obj = Resources.Load(资源名, typeof(Sprite)); ...

  3. [JavaEE] SSH框架笔记_eclipse搭建SSH框架详解

    SSH框架是最常用的框架之一,在搭建SSH框架的时候总有人遇到这样,那样的问题.下面我介绍一下SSH框架搭建的全过程. 第一步:准备工作. 下载好eclipse,Struts2,Spring,Hibe ...

  4. 2.1.4 扫描器X-Scan查本机隐患

    X-Scan是由安全焦点开发的一个功能强大的扫描工具.它采用多线程方式对指定IP地址段(或单机)进行安全漏洞检测,支持插件功能. 1.用X-Scan查看本机IP地址 利用X-Scan扫描器来查看本机的 ...

  5. java正则表达式常用实例——借鉴思路

    转载自:http://mp.weixin.qq.com/s?__biz=MjM5OTM4NDMyMg==&mid=2650044497&idx=1&sn=dc80fa35f7e ...

  6. iOS 虚拟机测试出现的相关问题

    一.报红 1.问题描述:自己在工程目录下新建文件夹 包其他文件夹下的.h 和.m文件拖到该文件夹 再删除工程中的报红文件复制进去新文件夹 运行报错:No such file or directory: ...

  7. SpringData JPA详解

    Spring Data JPA 1.    概述 Spring JPA通过为用户统一创建和销毁EntityManager,进行事务管理,简化JPA的配置等使用户的开发更加简便. Spring Data ...

  8. div/span等获取焦点问题(tabindex属性的简单理解)

    1.先看问题 当我们要对一个div/span元素获取焦点的时候,直接对$("#div1").focus()是不能实现效果的,比如下图: 当点击输入框进行输入后,在点击区域弹出选择地 ...

  9. [转]如何制作tizen镜像文件(图文教程)?

    http://blog.csdn.net/flydream0/article/details/9163119 之前已讲解了如何下载及编译tizen源码(http://blog.csdn.net/fly ...

  10. Matlab之文件操作

    1.判断是否存在文件夹:if (exist(folderName,'dir')) 2.创建文件夹:mkdir(folderName) 3.删除文件夹:rmdir(folderName,'s') 4.当 ...