动机:qmlconsole类似于chrome浏览器的devtool。用于运行时调试qml代码。用javascript控制台,执行指令。包括本软件提供的内置函数。

本项目整合到KTL项目上。但是KTL使用的QT版本为5.14。而qt6兼容的qt5,是特指5.15。5.15是专门兼容6.3的。所以KTL工具不支持。但是qmlconsole在基于>5.15的平台下使用,可以支持。

内置函数。封装在一个QtCpp类。提供exec,同步执行的函数,让qml去执行c++代码。exec函数使用sendMessage函数原型。所有新函数通过message来扩展。无须moc。exec函数位于最外层组件,所以提供一个expr函数,可以指定一个对象,在内层组件去执行表达式。

内置消息有几大类。

"object.",对应QObject,相关的c++调用。

“context.",对应QQmlContext相关的c++调用。

”engine.",对应QQmlEngine相关的c++调用。

“whatis",一个指令查看一个QObject对象的继承关系,

"parents",一个指令查看一个对象的所有parent。

”context",查看一个QQuickItem相关的QQmlContext。

“contexts",查看一个QQuickItem相关的QQmlContext,并且所有父级的QQmlContext。

控制台函数

pprint(),将一个数组或对象的属性,按行打印。

findId(), 可以对一个内层组件通过id查找对象, 并且可以通过类名获取singleton对象。

hire(),查看Item的组织结构。

hire(a) ,第一层,hire(a, 0, 0, 0) ,相当于 a[0][0][0]。结尾参数为-1,返回Item,而不是打印children。当结尾参数为-2时,另外还会对返回的Item,显示区域mask。

baseUrls(),可以查看一个Item所在的qml文件。

deepChildren(),这是一个帮助在c++层,查看children。因为在qml,并非所有对象都有children属性。而且有些框架的实现,视图树结构不根于RootItem。

deepItemChildren(),是将deepChildren()过滤掉非QQuickItem,只留QQuickItem。

maskItem(),将一个Item,用一个mask层显示出来。如果新建了一个窗口,需要将overlayMask.parent指向这个窗口的RootItem。

loadQml(),加载一个qml文件进行调试,效果同"加载..."按钮。加载后在qmlLoader.item。通过qmlContainer.setPreferredWidth()调整加载区的宽度。

控制台输入

提供两种方式,单行命令,多行文本输入。

单行命令,支持自动完成提示。只可以执行javascript。

多行文本输入,既支持javascript执行,也支持创建Item。可以利用创建Item,潜入内层组件从而再执行javascript。

下面介绍调试,TaoQuick, Industrial,MaterialUI,FluentUI组件库。

这几个组件库的例子都需要编译程序。下面的例子是直接去调试qml源文件,在缺少必要exe设置的环境的情况下,如何用qmlconsole将环境设置弄好。例如qmlconsole提供UrlInterpreter,将qrc资源路径直接拦截重定向到本地源文件。经过一番努力后,终于将FluentUI在5.14的环境下编译完成。

如果要调试组件库的例子,请在控制台的加载按钮:

TaoQuick,请加载samples/TaoQuickShow/Qml/main.qml

 1 import QtQuick 2.14
2 import TaoQuick 1.0
3
4 Item{
5 id:trans
6 property string transString: ""
7 Component.onCompleted: {
8 var _ = expr(qmlLoader.item, 'Qt.resolvedUrl(".")');
9
10 exec('context.setProperty', context,
11 {trans:trans,
12 imgPath:_ + '../Image/',
13 contentsPath:_ + '../Contents/',
14 hasShape:1})
15 }
16
17 CusButton {
18 Component.onCompleted: {
19 var innerObj = hire(this, 2); // BasicText
20 CusConfig.imagePathPrefix = exec('context.resolvedUrl', innerObj, '.') + '../../Images/'
21 }
22 }
23 }

并且执行

Industrial,请加载samples/Industrial/Main.qml

 1 import QtQuick 2.14
2 import Industrial.Controls 1.0
3 Button {
4 Component.onCompleted: {
5 var _ = exec('context.resolvedUrl', hire(this, 0, -1), '.');
6 var ret = exec('engine.addUrlInterceptor', this, ['qrc:/icons/', _ + '../icons/']);
7 console.log(_ + '../icons/');
8 console.log(ret);
9 }
10 }

并且执行

FluentUI,请加载samples/FluentUI/qml/winodw/MainWinodw.qml

 QtObject {
Component.onCompleted: {
var a = qmlLoader.item.contentItem;
var c = exec('contexts', hire(a, 0, -1))
var _ = exec('context.resolvedUrl', c[1], '.');
var ret = exec('engine.addUrlInterceptor', this, ['qrc:/example/', _ + '../../']);
console.log(_ + '../../');
console.log(ret);
}
}

并且执行

如果使用的组件库的话:

import TaoQuick 1.0

import Industrial 1.0

import FluentUI 1.0

用qmlconsole分析组织结构

用findElementByType,找出目标。hire查看组织结构,并mask显示目标。使用traceCursor,追踪鼠标点击的Item。用baseUrls查看,目标Item的源文件路径。等。

鼠标追踪traceCursor的使用。跟踪鼠标点击事件,当anime属性为1时,有动画效果。当配合ctrl点击时,测试target属性的满足点击位置的子Item,并打印在控制台。

动态创建Item

动态创建3D shader。

整合在KTL工具

https://github.com/bbqz007/KTL/releases。需要下载 KTL-v0.9.3 以及 patch.qml.7z。

Qml Console的更多相关文章

  1. ECMAScript 初探 - 对象篇

    一.对象 如果你用过 C++ 或 Java,肯定熟悉类(class).在 ECMAScript 中并没有 "类" 这个词, 其对应的是 "对象定义",不过这太拗 ...

  2. [QT_QML]qml假如调试信息 qDebug console.debug

    WinSys: win7 Qt Version: 5.8.0 使用Console调试 console.log 打印日志信息console.debug 打印调试信息console.info 打印普通信息 ...

  3. Qml 写的弹出层控件

    QML弹出窗口组件,灯箱效果.动画效果,可拖拽 核心思路:一个mask层,一个最顶层,都用rectangle,禁止事件穿透 使用 Popup { id: popup width: 200; heigh ...

  4. Qt qml listview 列表视图控件(下拉刷新、上拉分页、滚动轴)

    Qt qml listview下拉刷新和上拉分页主要根据contentY来判断.但要加上顶部下拉指示器.滚动条,并封装成可简单调用的组件,着实花了我不少精力:) [先看效果]    [功能] 下拉刷新 ...

  5. Qt qml treeview 树控件

    qml并没有提供树控件,只能自己写了.model仍然用ListModel对象,弄成层级的就行.delegate必须用loader动态的增加子控件,如此而已. [先看效果] [下载] http://do ...

  6. QT QML目录导航列表视图

    [功能] /目录.文件 /文件过滤 /递归 /事件 /高亮当前行 /当前选项 /目录切换动画 /限制根目录 [下载]:http://download.csdn.net/detail/surfsky/8 ...

  7. qml中打开本地html

    main.cpp QString tmploc = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation); QDi ...

  8. qml基础学习 基础概念

    一.概括 学习qt已有2年多的时间,从qt4.7开始使用直到现在正在使用的qt5.6,基本都在windows机器上做开发.最近有意向看了下qt的qml部分,觉着还是挺不错的,毕竟可以做嵌入式移动端产品 ...

  9. qml操作播放器

    现在增加了一个filter属性,所以可以很好和opencv结合.转一篇文章(http://blog.qt.io/blog/2015/03/20/introducing-video-filters-in ...

  10. qt 学习之路 :QML 语法

    前面我们已经见识过 QML 文档.一个 QML 文档分为 import 和对象声明两部分.如果你要使用 Qt Quick,就需要 import QtQuick 2.QML 是一种声明语言,用于描述程序 ...

随机推荐

  1. DeepSeek 解答了困扰我五年的技术问题。时代确实变了!

    你好呀,我是歪歪. 五年前,2020 年,我写文章的时候曾经遇到过一个技术问题,百思不得其解,当时把那个问题归类为玄学问题. 后来也会偶尔想起这个问题,但是我早就不纠结于这个问题了,没再去研究过. 前 ...

  2. C#下.NET配置文件的使用(1)

    原文链接:https://blog.csdn.net/dbzhang800/article/details/7212420 System.Configuration 命名空间中的东西是为读写应用程序的 ...

  3. 只需简单5步,Ansible脚本自动搭建AlwaysOn集群(已测试通过,可实际运行)

    只需简单5步,Ansible脚本自动搭建AlwaysOn集群(已测试通过,可实际运行) 之前已经介绍过这套脚本,请看下面↓ 一分钟搞定!CentOS 7.9上用Ansible自动化部署SQL Serv ...

  4. 洛谷B4038 [GESP202409 三级] 平衡序列 题解

    原题传送门 前言 当我以一种十分激动的心情参加了GESP的2024-9的三级考试时. 打开了此题,然后--自以为是的拿着暴力一顿乱写!然后TLE. 直到结束我还是没有想出来! (太菜了!!!) 以一种 ...

  5. IAP升级(STM32)

    IAP升级(STM32) IAP作用简述:将要升级的程序bin文件通过串口发送给STM32,STM32接收后存储到FLASH或者SRAM,用户通过事件(按键等)触发(也可延时自动触发)后将升级 文件夹 ...

  6. Ubuntu如何下载nvidia驱动和Cuda Toolkit

    Ubuntu如何下载nvidia驱动和Cuda Toolkit 前言 ‍ 手快不小心把 nvidia​ 的某个东西删除了,现在不得不全部卸载后再重新安装了. 我再也不敢在不确认内容的情况下,确认删除了 ...

  7. Golang入门:Linux上的go语言安装与配置

    Tips:本文以本文撰写时的 Go 语言最新版本,也就是 go.1.19.2 版本为例. Linux 发行版本使用 Ubuntu 22.04.1 LTS 为例来做演示. 安装 C 工具 Go 的工具链 ...

  8. go 定时任务库 cron

    简介 在Linux中,Cron是计划任务管理系统,通过crontab命令使任务在约定的时间执行已经计划好的工作,例如定时备份系统数据.周期性清理缓存.定时重启服务等. 本文介绍的cron库是一个用于管 ...

  9. go-ini 中文文档

    简介 地表 最强大.最方便 和 最流行 的 Go 语言 INI 文件操作库 灵活的数据源 不光光可以从文件读取配置,还支持 []byte 类型的纯数据读取和基于 io.ReadCloser 的流式读取 ...

  10. 通过 JS 修改具体标签的属性的属性值

    博客地址:https://www.cnblogs.com/zylyehuo/ window.addEventListener('DOMContentLoaded', function() { var ...