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

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

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

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

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

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

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


/**
头部操作区域.
*/
Rectangle {
id: titleOpRect
x: 0
y: 0
width: parent.width
height: 30 property string title : "Hello Board" MouseArea {
id: mouseMoveWindowArea
//height: 20
anchors.fill: parent acceptedButtons: Qt.LeftButton property point clickPos: "0,0" onPressed: {
clickPos = Qt.point(mouse.x, mouse.y)
//isMoveWindow = true
}
onReleased: {
//isMoveWindow = false
} onPositionChanged: {
var delta = Qt.point(mouse.x - clickPos.x, mouse.y - clickPos.y) //如果mainwindow继承自QWidget,用setPos
window.setX(window.x + delta.x)
window.setY(window.y + delta.y)
}
} Button {
id: closeButton width: 25
height: parent.height
text: "X" anchors.left: parent.left
anchors.leftMargin: 0
anchors.bottom: parent.bottom
anchors.bottomMargin: 0 flat: true
font.bold: true
font.pointSize: 14 onClicked: {
window.close()
}
} Text {
id: titleText text: title
anchors.bottom: parent.bottom //底部留点空间
bottomPadding: 5 } //end titleText Button {
id: newStrikeButton width: 25
height: parent.height
text: "+" anchors.right: parent.right
anchors.rightMargin: 0
anchors.bottom: parent.bottom
anchors.bottomMargin: 0 flat: true
font.pointSize: 22
} Frame {
width: titleOpRect.width
height: 1
anchors.bottom: titleOpRect.bottom
Rectangle {
height: parent.height
width: parent.width
color: "blue"
}
} }

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

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

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


/**
尾部操作区域.
*/
Rectangle {
id: footOpRect
anchors.bottom: parent.bottom
width: parent.width
height: 30 //resize区域
MouseArea {
id: resize
anchors {
right: parent.right
bottom: parent.bottom
}
width: 15
height: 15
cursorShape: Qt.SizeFDiagCursor property point clickPos: "1,1" //保持窗口左上角不动
property int oldX
property int oldY onPressed: {
clickPos = Qt.point(mouse.x, mouse.y)
//oldWidth = window.width
//oldHeight = window.height
oldX = window.x
oldY = window.y
} onPositionChanged: {
var delta = Qt.point(mouse.x - clickPos.x,
mouse.y - clickPos.y) var minWidth = 100;
var minHeight = 100; //最小
var newWidth = (window.width + delta.x)<minWidth?minWidth:(window.width + delta.x); //最小
var newHeight = (window.height + delta.y)<minHeight?minHeight:(window.height + delta.y); window.width = newWidth;
window.height = newHeight;
window.x = oldX
window.y = oldY
} onReleased: {
} Rectangle {
id: resizeHint
color: "red"
anchors.fill: resize
}
}
}

这段代码网上很常见,

  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. VBS脚本编程(5)——过程与函数

    过程是构成程序的一个模块,往往用来完成一个相对独立的功能.过程可以使程序更清. Sub过程与Function函数的区别: Sub没有返回值,Function有返回值: Sub不能放在表达式中,Func ...

  2. 图解 Redis | 差点崩溃了,还好有主从复制

    大家好,我是小林哥,又来图解 Redis 啦. 我在前两篇已经给大家图解了 AOF 和 RDB,这两个持久化技术保证了即使在服务器重启的情况下也不会丢失数据(或少量损失). 不过,由于数据都是存储在一 ...

  3. Spring Boot 无侵入式 实现RESTful API接口统一JSON格式返回

    前言 现在我们做项目基本上中大型项目都是选择前后端分离,前后端分离已经成了一个趋势了,所以总这样·我们就要和前端约定统一的api 接口返回json 格式, 这样我们需要封装一个统一通用全局 模版api ...

  4. Zabbix5.0微信报警

    3.1.注测企业微信: 3.2.企业微信注册成功后进入后台管理: 3.3.添加一个部门,并记住部门id: #我这里添加的子部门ID为2 3.4.添加一个用户到上面创建的部门里面(这里采取直接将管理员添 ...

  5. 8、基本数据类型(dict)

    8.1.字典: 1.字典元素用大括号括起来,用逗号分割每个元素,字典元素是"key:value"的形式 dic = { "k1": 'v1', #键值对 &qu ...

  6. Gym 101147G 第二类斯特林数

    大致题意: n个孩子,k场比赛,每个孩子至少参加一场比赛,且每场比赛只能由一个孩子参加.问有多少种分配方式. 分析: k>n,就无法分配了. k<=n.把n分成k堆的方案数乘以n的阶乘.N ...

  7. Series 1 java秒组合数

    Series 1 举几个例子发现,  系数中间对称,很容易想到组合数 c(n,m)==c[n,n-m).此题就是高精度求组合数,java秒之. time:1825ms   ,接近时限,如果n还稍微大一 ...

  8. 01_JVM与Java体系结构

    JVM发展历程 Sun Classic VM Exact VM 为了解决上一个虚拟机问题,jdk1.2时,sun提供了此虚拟机. Exact Memory Management:准确式内存管理 SUN ...

  9. AcWing 829. 模拟队列

    实现一个队列,队列初始为空,支持四种操作: (1) "push x" – 向队尾插入一个数x: (2) "pop" – 从队头弹出一个数: (3) " ...

  10. LVM拓展报错及处理

    LVM拓展报错: root@ming:/# lvextend -L +100G  /dev/ubuntu-vg/root Insufficient free space: 25600 extents ...