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

2网站制作莱芜网站建设与管理

2网站制作,莱芜网站建设与管理,wordpress图片怎么并排显示,网站双收录怎么做301跳转文章目录 前言一、环境配置二、实现步骤三、示例完整代码四、注意事项总结 前言 最近在进行QML的学习,发现一个比较有意思的交互设计:抽屉式侧边栏菜单,出于开发实战需求,最终实现了一个支持手势拖拽、弹性动画、蒙层效果和​​智…

文章目录

  • 前言
  • 一、环境配置
  • 二、实现步骤
  • 三、示例完整代码
  • 四、注意事项
  • 总结


前言

最近在进行QML的学习,发现一个比较有意思的交互设计:抽屉式侧边栏菜单,出于开发实战需求,最终实现了一个支持手势拖拽、弹性动画、蒙层效果和​​智能悬停检测​​的抽屉菜单,下面将我的示例内容进行展示,以便大家学习,如有错误之处,欢迎大家批评指正。

项目效果
请添加图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、环境配置

我的示例使用的是Qt5.14版本,需要确保包含 ​​Qt Quick Controls 2​​ 模块(安装时勾选Qt Quick Controls 2组件),需要在项目的.pro文件中添加:

QT += qml quick quickcontrols2

这里有详细的Qt安装和QML项目的创建步骤:Qt Creator的安装和Qml项目的创建
这里有QML的基础教程:QML快速入门(Quick Starter)

二、实现步骤

1、基础框架搭建

//通过ApplicationWindow创建主窗口
ApplicationWindow {id: mainWindowvisible: truewidth: 800height: 600title: "抽屉式菜单栏"......
}

2、顶部工具栏设计

//顶部工具栏
header: ToolBar {height: 50background: Rectangle {color: "#2196F3"   //蓝色背景}......//这里实现了汉堡菜单按钮,通过MouseArea检测悬停状态,并配合Timer实现​​智能延时关闭​​功能(详细代码见下文)......
}

3、抽屉菜单核心实现

//主内容区域
Item {id: mainContentanchors.fill: parent......//使用x坐标控制菜单位置,通过状态机(States)切换展开/收起状态,添加平滑动画过渡效果(详细代码见下文)......
}

4、高级交互功能

//边缘滑动手势检测,鼠标点击左侧区域后向右移动可以拉出菜单,双击也能展开菜单
MouseArea {id: drawerDragAreaanchors.left: parent.leftwidth: 20   //手势检测区域宽度height: parent.heightpropagateComposedEvents: true//拖拽起始位置的全局X坐标property real globalStartX: 0//鼠标按下事件处理onPressed: {globalStartX = mapToGlobal(mouseX, 0).xif(isDrawerOpen){mouse.accepted = false}}//位置变化事件处理onPositionChanged: {if (pressed) {//滑动距离超过25px时切换状态let currentGlobalX = mapToGlobal(mouseX, 0).xlet delta = currentGlobalX - globalStartXif (Math.abs(delta) > 10) {mainWindow.isDrawerOpen = delta > 0}}}//添加双击切换onDoubleClicked: isDrawerOpen = !isDrawerOpen
}

三、示例完整代码

1.main.qml

import QtQuick 2.14
import QtQuick.Controls 2.14ApplicationWindow {id: mainWindowvisible: truewidth: 800height: 600title: "抽屉式菜单栏"//当前选中的菜单项文本property string selectedMenuItem: "请选择菜单项"//是否正在与菜单栏交互property bool isMenuActive: false//菜单栏是否展开property bool isDrawerOpen: false//菜单栏宽度property int drawerWidth: 200//根据窗口宽度自动调整菜单栏宽度Component.onCompleted: {drawerWidth = Qt.binding(() => Math.min(200, mainWindow.width * 0.8))}//顶部工具栏header: ToolBar {height: 50background: Rectangle {color: "#2196F3"   //蓝色背景}Row {spacing: 20anchors.fill: parent//菜单入口按钮ToolButton {id: menuButtonhoverEnabled: true   //启用悬停检测​//是否悬停在按钮上property bool buttonHovered: false//按钮内容contentItem: Text {text: "☰"color: "white"font.pixelSize: 38}//鼠标交互MouseArea {anchors.fill: parenthoverEnabled: true//鼠标进入时展开菜单栏并修改悬停状态onEntered: {isDrawerOpen = truemenuButton.buttonHovered = true}//鼠标离开时重置状态并启动关闭计时器onExited: {menuButton.buttonHovered = falseif (!mainWindow.isMenuActive) {timer.restart()}}}//点击切换菜单栏状态//onClicked: isDrawerOpen = !isDrawerOpen//自动关闭菜单栏定时器Timer {id: timerinterval: 300   //延时300ms关闭onTriggered: {//双重验证是否满足关闭条件(未悬停在此按钮及菜单栏中)if (!mainWindow.isMenuActive && !menuButton.buttonHovered) {isDrawerOpen = false}}}}//应用标题Label {text: "我的应用"color: "white"font.bold: truefont.pixelSize: 18anchors.verticalCenter: parent.verticalCenter}}}//主内容区域Item {id: mainContentanchors.fill: parent//中央文本显示Text {id: contentTextanchors.centerIn: parenttext: mainWindow.selectedMenuItemfont.pixelSize: 24color: "#333333"}//遮罩层(展开菜单栏后出现)Rectangle {id: overlayanchors.fill: parentcolor: "#80000000"   //半透明黑色遮罩opacity: isDrawerOpen ? 1 : 0visible: opacity > 0enabled: visible//鼠标点击关闭菜单栏MouseArea {anchors.fill: parentonClicked: isDrawerOpen = false}//创建平滑的透明度渐变效果Behavior on opacity {NumberAnimation {duration: 200easing.type: Easing.OutQuad}}}//抽屉菜单栏容器Rectangle {id: drawerwidth: drawerWidthheight: parent.heightx: -drawerWidth  // 初始隐藏位置color: "#ffffff"//菜单栏悬停检测(注意这个需要放在ListView之前,否则动画效果异常)MouseArea {anchors.fill: parenthoverEnabled: truepropagateComposedEvents: true   //允许事件继续传递onEntered: mainWindow.isMenuActive = true//鼠标离开时重置状态并启动关闭计时器onExited: {mainWindow.isMenuActive = falsetimer.restart()}}//抽屉菜单列表ListView {anchors.fill: parentmodel: menuItems//菜单项模板delegate: ItemDelegate {id: menuItemwidth: drawerWidthheight: 50hoverEnabled: true//鼠标交互,处理悬停状态MouseArea {anchors.fill: parenthoverEnabled: truepropagateComposedEvents: true//设置为false,允许事件传递给ItemDelegate,不拦截点击事件onPressed: mouse.accepted = falseonEntered: mainWindow.isMenuActive = true//鼠标离开时重置状态并启动关闭计时器onExited: {//确保鼠标完全离开才更新状态if(!containsMouse) {mainWindow.isMenuActive = falsetimer.restart()}}}//背景样式background: Rectangle {color: menuItem.hovered ? "#2196F3" : "transparent"opacity: menuItem.hovered ? 0.6 : 0.3Behavior on color {ColorAnimation {duration: 150easing.type: Easing.OutCubic}}}//菜单项内容布局contentItem: Row {spacing: 10leftPadding: 10//图标Image {source: model.iconwidth: 24height: 24anchors.verticalCenter: parent.verticalCenter}//文本Text {text: model.titlecolor: "#444444"font.pixelSize: 16anchors.verticalCenter: parent.verticalCenter}}//点击事件处理onClicked: {console.log("切换到:", model.title)mainWindow.selectedMenuItem = model.title   //更新显示文本isDrawerOpen = false   //点击后自动关闭抽屉}}}//抽屉动画状态states: State {name: "opened"when: isDrawerOpenPropertyChanges {target: drawerx: 0}}//创建平滑缓动效果transitions: Transition {NumberAnimation {property: "x"duration: 300easing.type: Easing.InOutQuad}}}}//菜单项数据模型ListModel {id: menuItemsListElement { title: "首页"; icon: "qrc:/icons/home.png" }ListElement { title: "消息"; icon: "qrc:/icons/message.png" }ListElement { title: "设置"; icon: "qrc:/icons/settings.png" }ListElement { title: "个人中心"; icon: "qrc:/icons/profile.png" }}//边缘滑动手势检测MouseArea {id: drawerDragAreaanchors.left: parent.leftwidth: 20   //手势检测区域宽度height: parent.heightpropagateComposedEvents: true//拖拽起始位置的全局X坐标property real globalStartX: 0//鼠标按下事件处理onPressed: {globalStartX = mapToGlobal(mouseX, 0).xif(isDrawerOpen){mouse.accepted = false}}//位置变化事件处理onPositionChanged: {if (pressed) {//滑动距离超过25px时切换状态let currentGlobalX = mapToGlobal(mouseX, 0).xlet delta = currentGlobalX - globalStartXif (Math.abs(delta) > 10) {mainWindow.isDrawerOpen = delta > 0}}}//添加双击切换onDoubleClicked: isDrawerOpen = !isDrawerOpen}
}

四、注意事项

1、资源路径问题
其中菜单项数据模型中可以看到有图标资源,需要确保图标资源正确添加到.qrc文件,否则会显示为空白,在项目的源文件目录下添加了一个icons文件夹,其中有使用到的图片资源:

2、事件冲突处理​​
在代码中可以看到设置mouse.accepted = false,允许事件传递,避免阻断按钮点击事件


总结

这个示例中不仅实现了基础的抽屉菜单,还加入了​​手势交互​​、​​智能悬停检测等功能。可以看到QML的声明式语法让我们可以用少量代码实现复杂的动态效果,本文中实现这个示例也是比较简单的,要实现更复杂的功能还是需要不断的学习哦~


hello:
共同学习,共同进步,如果还有相关问题,可在评论区留言进行讨论。

参考文章:
Qt Creator的安装和Qml项目的创建
QML快速入门(Quick Starter)

http://www.dtcms.com/wzjs/534989.html

相关文章:

  • 万峰科技著.asp.net网站开发四酷全书电子工业出版社怎么样才能引流客人进店
  • 网站反向代理怎么做实训做网站收获
  • 北京网站设计公司sx成都柚米科技15做礼品建什么网站
  • 株洲网站制作公司阿里云服务器如何实现一个空间绑定两个不同主体的网站
  • 佛山网站建设的市场西安网站备案
  • 做企业网站专用词开发wap网站 转
  • 仙居网站建设贴吧中国化工建设网站
  • 网站建设优化的书籍模板建站seo优化
  • 网站推广的方法ppt深圳营销型网站制作
  • 洛阳霞光建设网站seo手机端排名软件
  • 建立一个企业网站司局网站维护廉政风险建设
  • 如何推广自己的网站建设网站流程
  • 招聘网站建设费用多少凡科怎么建设网站
  • 饶平网站建设公司高端品牌发布会
  • 徐州网站客户做婚礼设计在哪个网站下载素材
  • 网易网站开发语言直播网站建设开发
  • 现在还有企业做网站的吗哪些国家网站无须备案
  • 禅城建设网站做公众号微网站
  • 电商网站建设收费网站优化的主要目的是什么
  • 做的好的商城网站设计怎么在天猫注册开店铺
  • 贡井移动网站建设湖北省网站备案最快几天
  • 招聘网58同城招聘发布新手怎么做seo
  • 聊城做网站建设网页设计项目模板代码
  • 商城网站的管理用户模块网站建设自查及整改报告
  • 赣州做网站多少钱企业品牌vi设计
  • 山西响应式网站设计桂林学校网站制作
  • 网站实名认证要钱吗做外贸推广的平台
  • 石材公司网站北京网站sem、seo
  • 网站运营与管理的目的是搜索指数在线查询
  • 医疗网站整站优化思路出口企业网站建设