QT: 如何移动和缩放一个无边框窗口
一个QT窗口如下可以做到无边框:
Window {
id: window
//Designer 竟然不支持..., 设计模式时要注意
flags: Qt.FramelessWindowHint
width: 500
height: 300
title: "Window Title"
}
不过要注意, 这样QT Designer不支持, 在设计的时候可以先注释掉, 最后在打开.
一旦设置了FramelessWindowHint, 系统就不管你这个窗口的移动和缩放了, 就需要自己来处理了.
那怎么处理哪, 大概有以下思路
- 增加一个接收拖动事件的组件, 让它跟着鼠标移动
- 增加一个缩放锚点, 随着鼠标缩放
- 增加窗口四周的鼠标触发区域, 可以随着鼠标向四个方向缩放 (此文没包括实现) , 可以参考 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
}
}
}
这段代码网上很常见,
- 不过这里判断了窗口的最小高度和宽度, 不会导致窗口太小看不见
- 鼠标移动会导致负数, 所以这里也做了判断.
- 保持窗口左上角不动, 否则鼠标跑来跑去有问题.
That's all, Thanks.
QT: 如何移动和缩放一个无边框窗口的更多相关文章
- 【Qt编程】基于Qt的词典开发系列<四>--无边框窗口的缩放与拖动
在现在,绝大多数软件都向着简洁,时尚发展.就拿有道的单词本和我做的单词本来说,绝大多数用户肯定喜欢我所做的单词本(就单单界面,关于颜色搭配和布局问题,大家就不要在意了). 有道的单词本: 我所做的单词 ...
- 【Qt编程】基于Qt的词典开发系列<五>--无边框窗口的拖动
在上一篇文章中,我们讲述了如何进行无边框窗口的缩放与拖动,而在一些情况下,我们的窗口只需要进行拖动也不需要改变其大小,比如:QQ的登录窗口.本来在上一篇文章中已经讲述了如何进行窗口的拖动,但是却与窗口 ...
- 如何在pyqt中自定义无边框窗口
前言 之前写过很多关于无边框窗口并给窗口添加特效的博客,按照时间线罗列如下: 如何在pyqt中实现窗口磨砂效果 如何在pyqt中实现win10亚克力效果 如何在pyqt中通过调用SetWindowCo ...
- 让Qt的无边框窗口支持拖拽、Aero Snap、窗口阴影等特性
环境:Desktop Qt 5.4.1 MSVC2013 32bit 需要的库:dwmapi.lib .user32.lib 需要头文件:<dwmapi.h> .<windowsx. ...
- 如何实现一个无边框Form的移动和改变大小(一)
很多时候我们不希望使用Windows提供的窗体. 我们希望使用一个无边框的窗体,什么border,caption透明就行了. 下面我们来说下一些实现方法. 这个方法要求窗体自定义的border siz ...
- 如何在pyqt中在实现无边框窗口的同时保留Windows窗口动画效果(一)
无边框窗体的实现思路 在pyqt中只要 self.setWindowFlags(Qt.FramelessWindowHint) 就可以实现边框的去除,但是没了标题栏也意味着窗口大小无法改变.窗口无法拖 ...
- 如何在pyqt中给无边框窗口添加DWM环绕阴影
前言 在之前的博客<如何在pyqt中通过调用SetWindowCompositionAttribute实现Win10亚克力效果>中,我们实现了窗口的亚克力效果,同时也用SetWindowC ...
- Qt5:无边框窗口拖动
在窗口程序中,无边框窗口程序一般需要特殊处理才能拖动 Qt中,要实现无边框窗口的拖动,需要重新实现 mousePressEvent 和 mouseMoveEvent 俩虚函数 void Widget: ...
- [Winform]无边框窗口悬浮右下角并可以拖拽移动
摘要 简单实现了一个这样的功能,程序启动时,窗口悬固定在右下角,并可以通过鼠标拖拽移动. 核心代码块 无边框窗口并不出现在任务栏 //无边框 this.FormBorderStyle = System ...
随机推荐
- excel打印出现多余空白页
问题: 解决方法一:设置打印区域 步骤:选择需要打印的内容--页面布局--打印区域--设置打印区域即可 解决方法二:删除多余的打印空白页 步骤:视图--分页预览--选中多余的空白页删除即可
- drf-序列化器serializer
目录 一.序列化器-serializer 二.序列化器的使用 简单使用 高级使用 source **SerializerMethodField( ) ** 通用参数 三.反序列化数据校验 字段属性 局 ...
- 第9章:Ingress
9.1 Ingress为弥补NodePort不足而生 1 单独用service暴露服务的方式,在实际生产环境中不太合适 ClusterIP 只能在集群内部访问. NodePort 方式的话,测试环境使 ...
- 103、kickstart自动化安装操作系统
103.1.前言: 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装. 常规的办法有: 光盘安装系统===>一个 ...
- 浅读tomcat架构设计和tomcat启动过程(1)
一图甚千言,这张图真的是耽搁我太多时间了: 下面的tomcat架构设计代码分析,和这张图息息相关. 使用maven搭建本次的环境,贴出pom.xml完整内容: <?xml version=&qu ...
- Docker Swarm介绍
1 什么是swarmSwarm是Docker公司推出的docker集群管理平台,它将一群Docker主机变成了一台单一的虚拟Docker主机.Swarm使用标准的Docker API接口,因此,任何支 ...
- java封装继承以及多态(含代码)
封装 该露的露,该藏的藏 我们常需设计要追求,"高内聚,低耦合".高内聚就是类的内部数据操作细节自己完成.不允许外部干涉:低耦合:仅暴漏少量的方法给外部使用. 封装(数据的隐藏) ...
- tableview折叠动效
缘起于看见书旗小说的列表有点击折叠的动效,觉得十分炫酷.想了三分钟,不知道怎么写.晚上百度了下,知道了大致流程,于是自己实现了下,发现不少坑,于是写下这篇博文 实现原理: 1 tableview ce ...
- Entity Framework Core中的数据迁移命令
使用程序包管理控制台输入命令. 数据迁移命令: Add-Migration 对比当前数据库和模型的差异,生成相应的代码,使数据库和模型匹配的. Remove-Migration 删除上次的迁移 Sc ...
- Java中的四种引用和引用队列
目录 强引用 软引用 弱引用 幻象引用 Reachability Fence 参考 强引用 正常的引用,生命周期最长,例如 Object obj = new Object(); 当JVM内存不足时,宁 ...