一个QT窗口如下可以做到无边框:

  1. Window {
  2. id: window
  3. //Designer 竟然不支持..., 设计模式时要注意
  4. flags: Qt.FramelessWindowHint
  5. width: 500
  6. height: 300
  7. title: "Window Title"
  8. }

不过要注意, 这样QT Designer不支持, 在设计的时候可以先注释掉, 最后在打开.

一旦设置了FramelessWindowHint, 系统就不管你这个窗口的移动和缩放了, 就需要自己来处理了.

那怎么处理哪, 大概有以下思路

  1. 增加一个接收拖动事件的组件, 让它跟着鼠标移动
  2. 增加一个缩放锚点, 随着鼠标缩放
  3. 增加窗口四周的鼠标触发区域, 可以随着鼠标向四个方向缩放 (此文没包括实现) , 可以参考 https://evileg.com/en/post/280/{:target="_blank"}

我们先来看看如果拖动窗口, 代码如下:


  1. /**
  2. 头部操作区域.
  3. */
  4. Rectangle {
  5. id: titleOpRect
  6. x: 0
  7. y: 0
  8. width: parent.width
  9. height: 30
  10. property string title : "Hello Board"
  11. MouseArea {
  12. id: mouseMoveWindowArea
  13. //height: 20
  14. anchors.fill: parent
  15. acceptedButtons: Qt.LeftButton
  16. property point clickPos: "0,0"
  17. onPressed: {
  18. clickPos = Qt.point(mouse.x, mouse.y)
  19. //isMoveWindow = true
  20. }
  21. onReleased: {
  22. //isMoveWindow = false
  23. }
  24. onPositionChanged: {
  25. var delta = Qt.point(mouse.x - clickPos.x, mouse.y - clickPos.y)
  26. //如果mainwindow继承自QWidget,用setPos
  27. window.setX(window.x + delta.x)
  28. window.setY(window.y + delta.y)
  29. }
  30. }
  31. Button {
  32. id: closeButton
  33. width: 25
  34. height: parent.height
  35. text: "X"
  36. anchors.left: parent.left
  37. anchors.leftMargin: 0
  38. anchors.bottom: parent.bottom
  39. anchors.bottomMargin: 0
  40. flat: true
  41. font.bold: true
  42. font.pointSize: 14
  43. onClicked: {
  44. window.close()
  45. }
  46. }
  47. Text {
  48. id: titleText
  49. text: title
  50. anchors.bottom: parent.bottom
  51. //底部留点空间
  52. bottomPadding: 5
  53. } //end titleText
  54. Button {
  55. id: newStrikeButton
  56. width: 25
  57. height: parent.height
  58. text: "+"
  59. anchors.right: parent.right
  60. anchors.rightMargin: 0
  61. anchors.bottom: parent.bottom
  62. anchors.bottomMargin: 0
  63. flat: true
  64. font.pointSize: 22
  65. }
  66. Frame {
  67. width: titleOpRect.width
  68. height: 1
  69. anchors.bottom: titleOpRect.bottom
  70. Rectangle {
  71. height: parent.height
  72. width: parent.width
  73. color: "blue"
  74. }
  75. }
  76. }

关键代码在MouseArea的onPressed 和 onPositionChanged 事件上. 比较容易.

我们再来看看如果缩放窗口

这次我们只是在窗口右下角放一个小矩形区域, 来捕获鼠标移动事件, 以实现缩放.


  1. /**
  2. 尾部操作区域.
  3. */
  4. Rectangle {
  5. id: footOpRect
  6. anchors.bottom: parent.bottom
  7. width: parent.width
  8. height: 30
  9. //resize区域
  10. MouseArea {
  11. id: resize
  12. anchors {
  13. right: parent.right
  14. bottom: parent.bottom
  15. }
  16. width: 15
  17. height: 15
  18. cursorShape: Qt.SizeFDiagCursor
  19. property point clickPos: "1,1"
  20. //保持窗口左上角不动
  21. property int oldX
  22. property int oldY
  23. onPressed: {
  24. clickPos = Qt.point(mouse.x, mouse.y)
  25. //oldWidth = window.width
  26. //oldHeight = window.height
  27. oldX = window.x
  28. oldY = window.y
  29. }
  30. onPositionChanged: {
  31. var delta = Qt.point(mouse.x - clickPos.x,
  32. mouse.y - clickPos.y)
  33. var minWidth = 100;
  34. var minHeight = 100;
  35. //最小
  36. var newWidth = (window.width + delta.x)<minWidth?minWidth:(window.width + delta.x);
  37. //最小
  38. var newHeight = (window.height + delta.y)<minHeight?minHeight:(window.height + delta.y);
  39. window.width = newWidth;
  40. window.height = newHeight;
  41. window.x = oldX
  42. window.y = oldY
  43. }
  44. onReleased: {
  45. }
  46. Rectangle {
  47. id: resizeHint
  48. color: "red"
  49. anchors.fill: resize
  50. }
  51. }
  52. }

这段代码网上很常见,

  1. 不过这里判断了窗口的最小高度和宽度, 不会导致窗口太小看不见
  2. 鼠标移动会导致负数, 所以这里也做了判断.
  3. 保持窗口左上角不动, 否则鼠标跑来跑去有问题.

That's all, Thanks.

QT: 如何移动和缩放一个无边框窗口的更多相关文章

  1. 【Qt编程】基于Qt的词典开发系列<四>--无边框窗口的缩放与拖动

    在现在,绝大多数软件都向着简洁,时尚发展.就拿有道的单词本和我做的单词本来说,绝大多数用户肯定喜欢我所做的单词本(就单单界面,关于颜色搭配和布局问题,大家就不要在意了). 有道的单词本: 我所做的单词 ...

  2. 【Qt编程】基于Qt的词典开发系列<五>--无边框窗口的拖动

    在上一篇文章中,我们讲述了如何进行无边框窗口的缩放与拖动,而在一些情况下,我们的窗口只需要进行拖动也不需要改变其大小,比如:QQ的登录窗口.本来在上一篇文章中已经讲述了如何进行窗口的拖动,但是却与窗口 ...

  3. 如何在pyqt中自定义无边框窗口

    前言 之前写过很多关于无边框窗口并给窗口添加特效的博客,按照时间线罗列如下: 如何在pyqt中实现窗口磨砂效果 如何在pyqt中实现win10亚克力效果 如何在pyqt中通过调用SetWindowCo ...

  4. 让Qt的无边框窗口支持拖拽、Aero Snap、窗口阴影等特性

    环境:Desktop Qt 5.4.1 MSVC2013 32bit 需要的库:dwmapi.lib .user32.lib 需要头文件:<dwmapi.h> .<windowsx. ...

  5. 如何实现一个无边框Form的移动和改变大小(一)

    很多时候我们不希望使用Windows提供的窗体. 我们希望使用一个无边框的窗体,什么border,caption透明就行了. 下面我们来说下一些实现方法. 这个方法要求窗体自定义的border siz ...

  6. 如何在pyqt中在实现无边框窗口的同时保留Windows窗口动画效果(一)

    无边框窗体的实现思路 在pyqt中只要 self.setWindowFlags(Qt.FramelessWindowHint) 就可以实现边框的去除,但是没了标题栏也意味着窗口大小无法改变.窗口无法拖 ...

  7. 如何在pyqt中给无边框窗口添加DWM环绕阴影

    前言 在之前的博客<如何在pyqt中通过调用SetWindowCompositionAttribute实现Win10亚克力效果>中,我们实现了窗口的亚克力效果,同时也用SetWindowC ...

  8. Qt5:无边框窗口拖动

    在窗口程序中,无边框窗口程序一般需要特殊处理才能拖动 Qt中,要实现无边框窗口的拖动,需要重新实现 mousePressEvent 和 mouseMoveEvent 俩虚函数 void Widget: ...

  9. [Winform]无边框窗口悬浮右下角并可以拖拽移动

    摘要 简单实现了一个这样的功能,程序启动时,窗口悬固定在右下角,并可以通过鼠标拖拽移动. 核心代码块 无边框窗口并不出现在任务栏 //无边框 this.FormBorderStyle = System ...

随机推荐

  1. Oracle几大后台进程

    pmon,smon,dbwr,lgwr,reco,ckpt.六大核心进程.无论哪个进程出现故障,都会导致数据库实例崩溃.如果杀掉某个进程,在ALERT LOG中会发现各种错误. MMAN(Memory ...

  2. redis不完整的事务实现Transaction

    使用场景 redis一个命令执行是单线程的,不用担心并发冲突,如果你想有几个命令想像一个命令一样,在这几个命令执行过程中不会执行别的客户端发来的命令 ,也就是原子性,就可以用 redis Transa ...

  3. 关于安装运行MYSQL8.0简单使用及注意事项 On Docker Desktop & WSL2

    背景介绍 MYSQL是业界非常流行的一款关系型数据库系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性.MySQL所使用的SQL语言是用于访问数据 ...

  4. jquery 选择器 模糊匹配

    根据name值匹配 1.查询前缀为aa的数据 $("div[name^='aa']"); 2.查询后缀为aa的所有div的jquery对象 $("div[name$='a ...

  5. js 对json数据进行检索 插件 linq.js

    有时界面需要很多数据.但是多次访问服务器效率很低,所以需要检索json数据,最好是像sql查询语句那种 linq.js 插件 LINQ,语言集成查询(Language Integrated Query ...

  6. POJ 2084 Game of Connections 卡特兰数

    看了下大牛们的,原来这题是卡特兰数,顺便练练java.递归式子:h(0)=1,h(1)=1   h(n)= h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)h(0) ( ...

  7. webpack(8)vue组件化开发的演变过程

    前言 真实项目开发过程中,我们都是使用组件化的去开发vue的项目,但是组件化的思想又是如何来的呢?下面就从开始讲解演变过程 演变过程1.0 一般情况下vue都是单页面开发,所以项目中只会有一个inde ...

  8. inux下查看最消耗CPU、内存的进程

    1.CPU占用最多的前10个进程: ps auxw|head -1;ps auxw|sort -rn -k3|head -10 2.内存消耗最多的前10个进程 ps auxw|head -1;ps a ...

  9. Nginx 实践:location 路径匹配

    1. 目标 nginx 反向代理,路径映射的过程是什么?如何配置路径映射规则? 2.location 路径匹配 2.1 匹配规则: location 路径正则匹配: 符号 说明 ~ 正则匹配,区分大小 ...

  10. 关于scrollview的无限滚动效果实现

    起因及需求:做过阅读器的朋友应该知道,一般的阅读器都会有仿真.平移等特效.最近赶上真空期,项目不忙,有点时间,于是想抓起来,总结点干货. 仿真翻页及平滑翻页的基本实现: 仿真翻页,使用系统自带的UIP ...