Qml实现Dock浮动、停靠功能

效果展示

Qml Dock效果演示

github地址:

https://github.com/longtwilight/QmlDock

介绍

这是一个使用纯qml实现的Dock组件,它支持停靠、浮动、窗体分离、窗体独立、大小调整等功能。开源它的目的是为了寻求更多的功能(如侧边栏)、更好的结构设计、更通用的应用场景以及更好的稳定性和易用性。欢迎批评和指正。

环境

Qt版本:Qt6.2.4
编译器:mingw、msvc、gcc均支持

Demo代码

import QtQuick
import QtQml
import QtQuick.Controls
import QtQuick.Window
import "./Dock/"

ApplicationWindow {
    width: 1400
    height: 800
    visible: true
    title: qsTr("QmlDock Demo")
    MyDockHome{
        id: dockHome
        myDockState: MyDockBase.DockState.Fill
        anchors.margins: 2
        Dock{
            id: dock1
            width: 600
            height: 550
            name: "dock1"
            dockHome: dockHome
            closable: false
            dockTo: dock3
            direction: Dock.Direction.Center
        }
        Dock{
            id: dock2
            width: 300
            height: 600
            name: "dock2"
            dockHome: dockHome
            splittable: false
            dockTo: dock3
            direction: Dock.Direction.Left
        }
        Dock{
            id: dock3
            myDockState: MyDockBase.DockState.Fill
            name: "dock3"
            dockHome: dockHome
        }
        Dock{
            id: dock4
            width: 400
            height: 400
            myDockState: MyDockBase.DockState.Center
            name: "dock4"
            dockHome: dockHome
            closable: false
            splittable: false
        }
    }
}

参数说明

关键字说明取值
nameDock窗体的标题字符串
width / heightDock窗体宽度 / 高度整数
dockHome为了实现边缘的停靠,所有Dock窗体必须声明在DockHome类中,且该字段需声明为DockHome的idDockHome的id
closableDock窗体是否允许关闭true / false
splittableDock窗体是否允许从主窗体中独立出来成为单独窗体true / false
hideDock窗体默认是否显示,相当于visible属性,但visible与stacklayout视图有冲突,所以在此基础上多封装了一层true / false
myDockStateDock在DockHome中的默认状态,与anchors属性相似,但使用anchors属性会存在问题MyDockBase.DockState: Fill、Center、Top、Left、Right、Bottom、Float、Tab
dockTo窗体初始化时的停靠对象其他Dock窗体的id
direction窗体初始化时的停靠方向Dock.Direction: Center、Left、Top、Right、Bottom

API说明

方法名参数说明
focusDock()null使Dock窗体获得焦点(标题栏变成金黄色渐变色)
doDockTo(target,direction)target:待停靠的目标对象;direction:停靠方向用于js代码中动态停靠窗体
releaseDock()null取消停靠
splitToWindow()null将Dock窗体分离成为独立窗体
returnToDockHome()null将分离出去的Dock独立窗体收回到DockHome中
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好!感谢您的提问。下面是用QML实现最近打开文件功能的一种方式。 首先,在QML中创建一个ListView来显示最近打开的文件列表,代码如下: ``` ListView { id: recentFilesList model: recentFilesModel delegate: Rectangle { width: parent.width height: 30 color: index % 2 === 0 ? "#f2f2f2" : "#ffffff" Text { text: fileName anchors.verticalCenter: parent.verticalCenter anchors.left: parent.left leftPadding: 10 } MouseArea { anchors.fill: parent onClicked: { openFile(fileName) } } } } ``` 其中,recentFilesModel是一个ListModel,用于存储最近打开的文件路径和文件名。delegate是用来定义每一项的显示样式和点击事件的。这里我们使用一个矩形来实现每一项,包括一个文本标签用于显示文件名,以及一个鼠标区域用于响应点击事件。 然后,在QML中定义一个JavaScript函数openFile,用于打开选中的文件,代码如下: ``` function openFile(fileName) { // 打开文件的逻辑代码 } ``` 这里的代码需要根据具体的需求来实现打开文件的逻辑,例如使用Qt中的QFile和QTextStream类来读取文件内容。 最后,在QML中添加一个按钮或者菜单项,用于触发打开最近文件列表的操作,代码如下: ``` Button { text: "最近打开的文件" onClicked: { showRecentFilesList() } } function showRecentFilesList() { // 显示最近打开文件列表的逻辑代码 } ``` 这里的代码需要根据具体的需求来实现显示最近文件列表的逻辑,例如使用Qt中的QDialog类来实现一个对话框来显示最近文件列表。 以上就是用QML实现最近打开文件功能的一种方式。希望能对您有所帮助。如果您有任何问题,请随时追问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jumul

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值