Qt quick实现无边框可拖拽风格

由来:

    现在大量的软件采用简洁的风格,即移除系统的标题栏及边框并自己实现标题栏以达到定制的目的,由于我们写要用Qt写一个类似IM的软件,故有此需求。

方法:

去除系统边框比较简单,setFlags(Qt::Window | Qt::FramelessWindowHint);即可,但下一步要实现窗体的拖拽和缩放。

1,最简单的方法:

    这种方法比较简单直观,即点击鼠标的时候记录下鼠标位置,然后在鼠标移动的时候对窗体进行移动。示例代码如下:

 MouseArea { //为窗口添加鼠标事件
    property int xMouse //存储鼠标x坐标
    property int yMouse //存储鼠标y坐标
    anchors.fill: parent
    acceptedButtons: Qt.LeftButton //只处理鼠标左键
    drag.filterChildren: true
    onPressed: { //接收鼠标按下事件
        xMouse = mouse.x
        yMouse = mouse.y
    }
    onPositionChanged: { //鼠标按下后改变位置
        loginScreen.x = loginScreen.x + (mouse.x - xMouse)
        loginScreen.y = loginScreen.y + (mouse.y - yMouse)
    }
}

    以上方法简单直观,但当窗体比较复杂的时候将发生窗体移动比较迟钝,甚至,当从上标题快速拖拽窗体时,鼠标移出窗体,而窗体不再移动的问题。
    网上的一个案例,大家可以参考http://blog.sina.com.cn/s/blog_a6fb6cc90101au8r.html

2,改进方案:

    观察系统默认的带标题栏的窗体,发现,拖动窗体时,窗体并不移动,而是由一个矩形框随着鼠标移动,当松开鼠标后窗体才进行一次性地移动。
    于是,有了一个可行的方案(因为后面有更优的方案,但是如果后面的方案不行,这个方案可能成为最后的方案),当拖拽的时候绘制一个移动的和原窗体等大小的矩形进行移动,最后再一次性地移动(相信系统的拖拽也是采用类似的方案)。具体实施略,可以自行测试。

3,继续改进方案,应该是一个较优方案:

    具体原理我也是参照这个博客http://blog.sina.com.cn/s/blog_6288219501015dwa.html,讲得比较详细,虽然是mfc程序,但毕竟也是windows程序,原理相同。
    摘抄一段:

当窗口确定鼠标位置时,Windows向窗口发送WM_NCHITTEST消息,可以处理该消息,使得只要鼠标在窗口内,Windows便认为鼠标在标题条上。这需要重载CWnd类处理WM_NCHITTEST消息的OnNcHitTest函数,在函数中调用父类的该函数,如果返回HTCLIENT,说明鼠标在窗口客户区内,使重载函数返回HTCAPTION,使Windows误认为鼠标处于标题条上。

UINT MyWndDlg::OnNcHitTest(CPoint poin
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: qtquick 是一种快速开发应用程序的框架,其中包含了各种各样的组件和模板,方便开发人员进行快速的应用开发。qtquick 通过其强大的绘图能力可以用来实现离线地图。 首先,我们可以利用 qtquick 提供的图形化编程界面设计地图的视图,包括地图的初始位置、缩放比例、地图标记和附近的公共设施等等。然后,我们可以加载本地的地图缓存文件,比如我们可以下载一些开源的地图缓存文件并存储在本地,然后在地图控件中设置加载本地文件的路径,这样即可实现离线地图的显示。 不仅如此,利用 qtquick 进行地图开发还可以实现定位、导航等功能,我们可以在地图上设置一个位置标记控件,实时更新用户的位置信息。同时,我们可以利用 qtquick 提供的网络模块加载实时的天气信息或交通状况,提供更加细致的地图服务。 需要注意的是,离线地图的开发需要先下载地图缓存文件,所以开发者需要在应用程序内提供下载缓存文件的功能,同时,地图缓存文件的更新和存储也需要进行定期管理。但是qtquick提供了较好的兼容性及良好的UI效果,使开发者可以快速实现离线地图的开发需求。 ### 回答2: QtQuickQt中用于构建图形界面的框架,它可以通过QML语言轻松实现各种UI效果。为了实现离线地图功能,我们可以利用Qt中的QML与C++结合的方式进行开发。 首先,在C++中使用QGeoTiledMappingManager引擎加载离线瓦片图层,这个类本身是可以支持加载在线瓦片图层。但是在加载离线瓦片时,可以自己实现缓存机制,避免多次读取离线瓦片。 然后,在QML中引用这个C++类并通过QML属性将地图上的视图坐标映射为地理坐标,同时地图上的图标、线、面等元素可以通过QML的Canvas来实现。通过绑定和交互,我们可以获得用户在地图上的操作,实现缩放、拖拽地图,地图上标点、画线等操作。 此外,为了提升地图效率和交互体验,还可以通过QQuickFramebufferObject来实现自定义地图渲染,利用显卡进行加速。 综上,QtQuick结合C++可以快速实现离线地图功能,并借助Qt的丰富生态,可以轻松扩展到网络请求、数据存储等不同场景。 ### 回答3: 随着移动设备的普及,使用离线地图的需求越来越大。在Qt框架中,QtQuick是一种轻量级的用户界面呈现技术,非常适合开发移动应用程序。实现离线地图的过程可以通过以下几个步骤: 1. 获取地图数据 首先,需要获取离线地图数据。可以通过访问地图供应商的API获取数据,例如OpenStreetMap或Google Maps。然而,有些供应商可能需要支付费用才能使用API,而且有些很难获取。因此,如果需要使用免费的地图数据,你可以选择在OpenMapTiles等网站下载离线地图的数据。 2. 解析地图数据 获取地图数据后,需要使用Qt的API来解析它们,然后将它们转换为QtQuick中使用的格式。通常,地图数据包含在大型文件中,如GeoJSON或MBTiles。为了快速适配数据,可以使用QGeoJson或MBTiles格式,并使用QML中的Model来加载它们。 3. 使用QtQuick绘制地图 重要的一步是使用QtQuick中的MapType和Map对象来显示地图。QtQuick的MapType对象表示要显示的地图类型,如卫星影像或路线图。同时,Map对象是地图的主容器,控制它的平移和缩放。 4. 添加地图覆盖层 QtQuick还允许添加自定义图层到地图上,如标记点、线条、多边形或文字注释。这允许在地图上添加个性化信息或强化视觉效果。可以使用Image或Item组件制作标记点、方块或其他形状的图层,并使用QtQuick中的Canvas来绘制线条、多边形或自定义形状。 总之,使用QtQuick实现离线地图是一个高效而灵活的方法,可以使应用程序更加可扩展。可以使用QtQuick的API和组件以易于维护和更新的方式访问和处理地图数据。此外,QtQuick提供了灵活的功能,在创建高效可观察的应用程序时非常具有优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值