当前位置: 首页 > news >正文

qml去掉标题栏后实现窗口拖动

在去掉窗口标题栏后窗口会失去鼠标拖动效果,所以需要自己添加拖动效果。

实现代码:

 ApplicationWindow { 
    id: mainWindow 
    visible: true 
    width: 900 
    height: 600 
    title: qsTr("Hello World") 
    flags: Qt.Window | Qt.FramelessWindowHint //去标题栏 
    property int mainWindowX //用来存储主窗口x坐标 
    property int mainWindowY //存储窗口y坐标 
    property int xMouse //存储鼠标x坐标 
    property int yMouse //存储鼠标y坐标 
    MouseArea { //为窗口添加鼠标事件 
        anchors.fill: parent 
        acceptedButtons: Qt.LeftButton //只处理鼠标左键 
        onPressed: { //接收鼠标按下事件 
            xMouse = mouseX 
            yMouse = mouseY 
            mainWindowX = mainWindow.x 
            mainWindowY = mainWindow.y 
        } 
        onPositionChanged: { //鼠标按下后改变位置 
            mainWindow.x = mainWindowX + (mouseX - xMouse) 
            mainWindow.y = mainWindowX + (mouseY - yMouse) 
        } 
    } 
} 

解析:


在鼠标被按下后将当前的窗口坐标和鼠标当前坐标保存,带鼠标在按下左键后进行移动时,首先用mouseX – xMouse和mouseY – yMouse计算出鼠标在x轴和y轴所移动的距离,然后将鼠标移动的距离与主窗口的x,y坐标相加得出窗口的变换坐标,然后设置主窗口的坐标令其改变位置。

使用上述方法虽然能实现窗口的拖动,但是效果却不佳,在用鼠标进行拖动的时候窗口的移动会出现延迟和卡顿的现象,所以建议使用下面这种方法:

 ApplicationWindow { 
    id: mainWindow 
    visible: true 
    width: 900 
    height: 600 
    title: qsTr("Hello World") 
    flags: Qt.Window | Qt.FramelessWindowHint //去标题栏 

    MouseArea { //为窗口添加鼠标事件 
        anchors.fill: parent 
        acceptedButtons: Qt.LeftButton //只处理鼠标左键 
        property point clickPos: "0,0"
        onPressed: { //接收鼠标按下事件 
                clickPos  = Qt.point(mouse.x,mouse.y)
        } 
        onPositionChanged: { //鼠标按下后改变位置 
                //鼠标偏移量
                var delta = Qt.point(mouse.x-clickPos.x, mouse.y-clickPos.y)

                //如果mainwindow继承自QWidget,用setPos
                mainWindow.setX(mainWindow.x+delta.x)
                mainWindow.setY(mainWindow.y+delta.y)
        } 
    } 
}

相关文章:

  • Qt for android 在安卓上面运行app启动闪黑屏的解决方法
  • Qt 中文及字符混合加密,双重加密解密
  • Qt 实时监控网络状态
  • VNISEdit工具打包QT程序
  • Linux安装python3.6
  • Qt如何输出日志输出文件(最全最新的框架方法,包含Qt4和Qt5)
  • GCC 7.3.0编译安装
  • add-apt-repository: command not found
  • Ubuntu12.04升级C++11标准
  • ubuntu中安装lua5.3
  • ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
  • luasql脚本工具的安装
  • 安装redis 及常见问题
  • 彻底解决Mysql中文乱码
  • redis通过6379端口无法连接服务器
  • 【译】JS基础算法脚本:字符串结尾
  • [译]CSS 居中(Center)方法大合集
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 30秒的PHP代码片段(1)数组 - Array
  • ES2017异步函数现已正式可用
  • java正则表式的使用
  • Java知识点总结(JavaIO-打印流)
  • Markdown 语法简单说明
  • maven工程打包jar以及java jar命令的classpath使用
  • PAT A1120
  • SpringCloud集成分布式事务LCN (一)
  • Transformer-XL: Unleashing the Potential of Attention Models
  • use Google search engine
  • 关于字符编码你应该知道的事情
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 入门到放弃node系列之Hello Word篇
  • 在Mac OS X上安装 Ruby运行环境
  • Spring第一个helloWorld
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • # centos7下FFmpeg环境部署记录
  • #14vue3生成表单并跳转到外部地址的方式
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (1)常见O(n^2)排序算法解析
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)Scala的“=”符号简介
  • (状压dp)uva 10817 Headmaster's Headache
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .NET程序员迈向卓越的必由之路
  • .net和php怎么连接,php和apache之间如何连接
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • [ 转载 ] SharePoint 资料