QML + KDDockWidget 实现 tabwidget效果( 窗口可独立浮动和缩放)

news2024/12/23 3:47:11

前言

前面文章介绍过在QML中使用ListView实现TabBar标签拖拽交换位置效果(文章在这里)

先在此基础上升级一下,结合KDDockWidget做一个可浮动的窗口效果。

关于KDDockWidget的介绍,以前的文章有写过,可参考:
qml dockwidget窗口停靠
KDDockWidgets源码编译及安装

KDDockWidget是第三方开源项目,可以用于实现QML中Dock窗口效果,Qt本身不支持QML的Dock效果,所以正好弥补这部分空缺。而KDDockWidget中其实是支持Tab合并效果,但是在实际使用过程中遇到很多问题,该功能并不是很完善,所以索性自己使用QML来实现tabbar效果,然后结合KDDockWidget,可将每个tab页面进行单独的浮动和缩放。

先看效果:
在这里插入图片描述


本文Demo下载
点击下载

KDDockWidget动态库编译环境 VS2019
Demo使用环境 Qt5.15.2+VS2019


正文

关于ListView实现一个tabbar移动效果,前面文章有介绍过,这里简单贴个代码:

ListView{
    id:tabBar
     anchors.left: parent.left
     anchors.right: parent.right
     anchors.rightMargin: 66
     interactive: false
     anchors.leftMargin: 20
     z:15
     height: 30
     spacing: 1
     orientation:ListView.Horizontal
     currentIndex: -1;
     move: Transition {
         NumberAnimation { property: "x"; duration: 150 }
     }
     moveDisplaced: Transition {
         NumberAnimation { property: "x"; duration: 150 }
     }
     model:ListModel{
         id:tabModel
         onCountChanged: {
             if(count > 0)
                 tabBar.currentIndex = count-1
         }
     }

     delegate: TabButton{
         id:tabButton
         height: 30
         width: 120

         contentItem: Text {
             font.pixelSize: 14
             font.family: "Source Han Sans SC"
             text: dockname
             horizontalAlignment: Text.AlignHCenter
             verticalAlignment: Text.AlignVCenter
             color: tabBar.currentIndex === index ? "#3692F0" :"#525252"
             elide: Text.ElideMiddle
         }

         background:Item{
             Rectangle {
                 color: tabBar.currentIndex === index ? "#171717" : "transparent"
                 border.width: tabBar.currentIndex === index ? 1 : 0
                 border.color: "#404040"
                 height: parent.height+3
                 width: parent.width
                 x:-1;y:-2
                 Rectangle{
                     y:parent.height-1
                     width: parent.width
                     height: 3
                     color: "#171717"
                     visible: tabBar.currentIndex === index
                     z:20
                 }
             }
         }

         MouseArea{
             id:ma2
             anchors.fill: parent
             preventStealing: true
             hoverEnabled: true
             onPositionChanged: {
                 var other_index = tabBar.indexAt(ma2.mouseX + tabButton.x, ma2.mouseY + tabButton.y);
                 if (other_index !== -1 && pressed) {
                     if (index !== other_index) {
                         tabModel.move(index, other_index,1);
                         tabBar.positionViewAtIndex(other_index,ListView.Center)
                     }
                 }
             }
             onClicked: {
                 tabBar.currentIndex = index
             }
         }
     }
 }

接下来看每个单独的dock窗口

import QtQuick 2.0
import QtQuick.Controls 2.15
import com.kdab.dockwidgets 1.0 as KDDW

KDDW.MainWindowLayout{
    id:panel
    property string dockName: "dock#1"
    uniqueName:"MainLayout1"

    KDDW.DockWidget{
        id:dock1
        uniqueName:"dock#1"
        property bool isFirstFloating: true
        property bool floating: false

        Rectangle{
            color:"#171717"

            Label{
                text:"This is Dock #1"
                anchors.centerIn: parent
                font.pixelSize:40
                color: "white"
            }
        }

        onSigFloatClicked:{
            dock1.floating = !dock1.floating
            if(!dock1.isFloating){
                removeTimer.name = panel.dockName
                removeTimer.start()
            }
            else{
                addData(panel.dockName)
            }

        }
        //关闭按钮已在DockTitleBar中隐藏
//        onSigCloseClicked:{
//            removeData(panel.dockName)
//        }
    }

    Component.onCompleted: {
        addDockWidget(dock1,KDDW.KDDockWidgets.Location_OnLeft)
    }
}

由于我们是自定义的tabbar效果,所以这里没有用KDDockWidget提供的addDockWidgetAsTab接口,而是直接使用addDockWidget,每个tab page是一个单独的MainWindowLayout,包含一个独立的DockWidget。浮动窗口功能是直接点击floating button来调用相应接口实现。

代码中用到的KDDockWidget是在源码基础上进行部分修改后重新编译成的动态库,可根据实际项目需求,对源码进行适当修改,若需要修改后的源码,可联系我提供。

本文只实现了窗口的浮动效果,没有添加窗口关闭,若有需要,可在自动以标题栏中将关闭按钮显示出来,并添加其逻辑即可。

不解之处,可私信。


本文Demo下载
点击下载

KDDockWidget动态库编译环境 VS2019


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64584.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Python计算机毕业设计SSM健身俱乐部管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

移动WEB开发之rem布局--rem适配方案

思考 1. 我们适配的目标是什么? 2. 怎么去达到这个目标的? 3. 在实际的开发当中使用? 答案 1. 让一些不能等比自适应的元素,达到当设备尺寸发生改变的时候,等比例适配当前设备。 2. 使用媒体查询根据不同设备按比例…

idea高级调试技巧

前言 对于一名开发者来说,找出并处理掉Bug是不可或缺的能力。能够熟练的调试程序将大大提升开发的效率。学好DeBug,再多Bug也不怕。Debug用来追踪代码的运行流程,通常在程序运行过程中出现异常,启用Debug模式可以分析定位异常发生…

chapter7——处理字节顺序

目录1.定义2.小端模式和大端模式的比较3.处理字节顺序不匹配的问题4.访问32位存储器5.处理字节顺序不匹配6.字节顺序中性代码7.字节顺序中性编码指南1.定义 字节顺序定义数据在计算机系统中的存储格式。它描述存储器中地址的最高有效位(MSB)和最低有效位…

基于百度地图的交通查询的毕业设计(android)

目 录 1 前言 1 1.1 背景 1 1.2 论文主要内容与结构 1 2 基础技术介绍(一) 2 2.1 Android概述 2 2.2 Android架构 2 2.3 Android应用程序类型分析 5 3 基础技术介绍(二) 6 3.1 地图简介 6 3.1.1 地图概念 6 3.1.2 构成…

力扣(LeetCode)97. 交错字符串(C++)

动态规划 状态转移方程 f[[i,j]f[i−1,j]∣∣f[i,j−1]f[[i,j] f[i-1,j]\ ||\ f[i,j-1]f[[i,j]f[i−1,j] ∣∣ f[i,j−1] ,仅当最后一个字符匹配。 class Solution { public:bool isInterleave(string s1, string s2, string s3) {int n s1.size(),m s2.size();…

更够实现输入检验输入框

输入检验输入框 效果展示 概述 本文讲解如何书写&#xff0c;可以根据输入内容的在鼠标失去焦点的时候&#xff0c;进行检验的输入框。 构建HTML框架 <body><div class"register"><input type"password" class"ipt"><p…

「Redis」06 事务与锁机制

笔记整理自【尚硅谷】Redis 6 入门到精通 超详细 教程 Redis——事务与锁机制 1. Redis的事务定义 Redis 事务是一个单独的隔离操作&#xff1a;事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中&#xff0c;不会被其他客户端发送来的命令请求所打断。注意&…

[附源码]Python计算机毕业设计SSM教师业绩考核和职称评审系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

D-024 VGA硬件电路设计

VGA硬件电路设计1 简介2 引脚定义3 硬件电路实战4 硬件设计要点1 简介 VGA&#xff08;Video Graphic Arrary&#xff09;即视频图形阵列&#xff0c;是 IBM(国际商业机器公司)在 1987 年随 PS/2 机一起推出的使用模拟信号的一种视频传输标准&#xff0c;在当时具有分辨率高、…

基于STM32的智能GPS定位系统(云平台、小程序)

背景及目标 前阵子&#xff0c;准确的说是好几个月前买了一辆电瓶车&#xff0c;当时呢因为车停得很随意&#xff0c;所以想给小电驴装一个GPS&#xff0c;一方面是防盗&#xff0c;另一方面是为了测速和绘制骑行轨迹&#xff0c;要是能联动电瓶车状态远程监测就更好了。当然我…

马上年末了,你还不会写测试总结吗?

最近参与了几次面试&#xff0c;面试者的简历中都会提及&#xff1a;需求或者版本测试结束后会进行测试总结&#xff0c;不仅仅提供一份测试报告以及相关文档手册。 于是特意追问了一下&#xff0c;测试总结中都包含什么内容。 答复上基本都是&#xff1a;执行了多少用例、发…

帝国cms漏洞分析前台XSS漏洞

帝国cms漏洞分析前台XSS漏洞 一、帝国cms漏洞描述 该漏洞是由于javascript获取url的参数,没有经过任何过滤,直接当作a标签和img标签的href属性和src属性输出。 二、帝国cms漏洞复现 1、需要开启会员空间功能(默认关闭),登录后台开启会员空间功能。 2、漏洞出现的位置在/…

AR+GIS赋能地下管线,匹配真实位置

地下管线是城市运行的生命线&#xff0c;对保障城市运行起到至关重要的作用。但是地下管线都埋藏于地下看不见&#xff0c;摸不着&#xff0c;当工程师需要查看或者检修地下管线时往往就不那么方便了&#xff0c;经常发生破坏地下管线的事故&#xff0c;那有没有什么技术可以让…

122页6万字消防大数据平台建设方案

目 录 第1章 设计说明 1.1 工程概述 1.1.1 工程名称 1.1.2 承建单位 1.1.3 建设目标 1.1.4 建设内容 1.1.5 建设规模 1.1.6 建设周期 1.2 设计依据 1.3 相对可行性研究报告批复的调整情况 1.4 合理化建议 1.4.1 统一、开放的通讯协议标准 1.4.2 充分利用联网单位消…

Git分支管理,运维知道吗?

需求 对于代码的管理&#xff0c;不知你是否遇到过以下几种情况&#xff1a; 存在多种版本管理工具&#xff0c;如svn、git&#xff0c;无法做到代码统一管理&#xff1b;多人协作开发&#xff0c;代码合并冲突频发&#xff1b;分支管理混乱&#xff0c;存在很多个性化分支&a…

常用工具类之spring-boot-devtools热部署

SpringBoot热部署 热部署不会用在生产环境&#xff0c;但对于程序员开发的效率&#xff0c;还是有一定帮助的&#xff0c;所谓的热部署&#xff0c;就是在应用程序在不停止的情况下&#xff0c;实现新的部署 spring-boot-devtools 是一个为开发者服务的一个模块&#xff0c;其中…

JAVA小区门户网站(源代码+论文)

小区门户网站之社区共享 摘 要 随着计算机的不断发展和广泛应用&#xff0c;人们的工作效率得到不断的提高。互联网的发展&#xff0c;更是缩短了人们之间的距离。如何充分利用互联网&#xff0c;这是大家共同关心的问题。本文主要介绍了关于小区门户网站之社区共享的实现方法…

【GD32F427开发板试用】IAR flash loader 下载GD32F427流程简要分析

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;andeyqi 很高兴获的社区的GD32F427开发板的评测机会&#xff0c;这几年芯片慌大家都能感受到&#xff0c;项目上经常因为货源紧张不断更换替代…

java面向对象 继承 多态

目录 继承性(inheritance) 为什么要有继承&#xff1f; 作用&#xff1a; 继承举例 方法的重写 重写举例 四种访问权限修饰符 关键字—super 关键字super举例 调用父类的构造器 调用父类构造器举例 子类对象的实例化过程 多态性 概念 使用 多态性应用举例 虚…