QT Demo 之 calqlatr(2) calqlatr.qml

本文详细分析了QT Demo中`calqlatr.qml`的代码结构,重点讲解了`onWidthChanged`和`onHeightChanged`事件响应、`digitPressed`和`operatorPressed`函数、AnimationController的使用,以及Display控件的实现。文章揭示了QML中`onXXXChanged`事件响应函数的工作原理,探讨了跨文件使用Object Id的风险,并介绍了AnimationController的属性和方法,如`animation`、`progress`以及`completeToBeginning()`和`completeToEnd()`函数。通过对Display部分的分析,展示了如何通过MouseArea控制UI变化。整体上,该文深化了对QML动画控制和事件处理的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import QtQuick 2.0
import "content"
import "content/calculator.js" as CalcEngine

同样,这次我们针对qml代码开始的最常见的import部分也不放过了,也要至少做到基本了解和使用。

在Qml中如果需要使用系统组件,必须在开始进行声明。对于自定义的组件也需要在开始的时候import进来,并且需要注意的是,系统组件直接通过名称即可,而对于自定义组件,需要使用""包起来。

QML支持三种的import,分别是:

  • import组件(命名空间):The most common type of import is a module import. Clients can import QML modules which register QML object types and JavaScript resources into a given namespace.
  • import目录:      A directory which contains QML documents may also be imported directly in a QML document. This provides a simple way for QML types to be segmented into reusable groupings: directories on the filesystem.
  • import js文件:JavaScript resources may be imported directly in a QML document. Every JavaScript resource must have an identifier by which it is accessed.

注:三种import中只有import js时,必须使用as指定出唯一的一个Identifier,其它两种可选。

calqlatr.qml的代码主结构

Rectangle {
    id: window
    width: 320
    height: 480
    focus: true
    color: "#272822"

    onWidthChanged: controller.reload()
    onHeightChanged: controller.reload()

    function operatorPressed(operator) { CalcEngine.operatorPressed(operator) }
    function digitPressed(digit) { CalcEngine.digitPressed(digit) }

    Item {}

    AnimationController {}

    Display {}

}

其中id/width/height和color这几个基本properties无需多讲,在之前的示例代码中已经多次使用。这次新用到的一个property是focus,但是我们发现,就算我们把focus的值改为false或者去掉focus属性(使用default值)后,程序的运行并没有任何异常和不同。这里只能说明在这个示例中目前没有使用到这个property,TODO:后面我们会学习到focus这个property具体的作用

onWidthChanged和onHeightChanged

在代码中有下述两行:

    onWidthChanged: controller.reload()
    onHeightChanged: controller.reload()

其意思非常好理解,就是当width或height改变的时候,调用controller.reload()函数来完成UI的重绘。但是让我纠结的是,onWidthChanged和onHeightChanged这两个事件响应函数是在那里定义的???

当我尝试通过帮助文档寻找这两个函数或者关于width和height的signal时,结果也是没有找到。这个时候,我就猜测了,估计又是Qt做了一些内置处理但是又没有任何文档说明的事情。

是不是,针对每一个property,都会有对应的onXXXChanged事件响应函数?答案,是的。因此,除了上面的onWidthChanged和onHeightChanged函数,还有下面的一系列函数:

    onParentChanged: ;
    onOpacityChanged: ;
    onColorChanged: ;
    onXChanged: ;
    onYChanged: ;
    onVisibleChanged: ;
    onFocusChanged: ;

当然,对于id这个特殊的property,就没有对应的onIdChanged函数了。

digitPressed(digit)和operatorPressed(operator)函数

紧接着下面就又定义了两个函数:

    function operatorPressed(operator) { CalcEngine.operatorPressed(operator) }
    function digitPressed(digit) { CalcEngine.digitPressed(digit) }

在之前的文章《如何在QML中定义和使用函数》是我们有了解到如何在Qml中定义和调用一个函数,这里的函数主体也非常简单,是直接透传调用content/calculator.js中对应的函数。但是这两个函数是在哪里有调用到呢???

我找找找,当前文件中没有,无奈使用grep进行查找,发现在Button.qml中有下述的函数调用:

    MouseArea {
        onClicked: {
            if (operator)
                wind
<think>好的,用户现在在询问如何查看他们列出的QtQuick/Controls目录下的文件列表。他们之前遇到了QML模块缺失的问题,现在可能是在检查安装情况。我需要解释这些文件的作用,特别是如何确认模块版本是否存在。 首先,用户运行了ls命令,显示了一堆.qml.qmlc和插件文件。我需要解释这些文件类型,比如.qmlQML源码,.qmlc是编译后的缓存,还有插件库.so文件。然后,用户之前的问题是关于QtQuick.Controls 2.12未安装,所以需要指导他们如何确认版本是否正确。 用户可能想知道这些文件是否包含所需的2.12版本。我需要指出检查qmldir文件的重要性,因为里面会注明模块版本。如果用户没有找到正确的版本号,可能需要安装对应的包或者检查Qt安装路径是否正确。 另外,用户可能在嵌入式环境(RK3588)下工作,需要注意架构是否匹配,比如aarch64目录是否正确。还要提醒他们确认Qt安装是否完整,或者是否需要部署额外的文件到设备上。 需要给出具体的命令,比如查看qmldir内容,检查版本号,以及可能的解决方案,如安装特定包或设置环境变量。同时,如果版本不对,可能需要更新Qt或重新部署模块。 最后,确保回答清晰,步骤明确,帮助用户一步步排查问题,确认模块是否存在,以及如何解决版本不匹配的问题。</think>这是您当前系统安装的QtQuick.Controls模块内容列表,我们可以通过以下方式解读这些文件结构和版本信息: 📂 目录结构解析: ``` /usr/lib/aarch64-linux-gnu/qt5/qml/QtQuick/Controls ├── *.qml # QML组件源文件(可读文本) ├── *.qmlc # 预编译的QML字节码(优化执行速度) ├── plugins.qmltypes # 类型注册文件 ├── qmldir # 模块声明文件(关键版本信息) └── libqtquickcontrolsplugin.so # 核心插件库 ``` 🔍 关键检查步骤: 1. **确认模块版本**(通过qmldir文件) ```bash cat qmldir # 输出内容应包含类似: # module QtQuick.Controls # typeinfo plugins.qmltypes # prefer :/qt-project.org/imports/QtQuick/Controls/ # depends QtQuick 2.12 # depends QtQuick.Templates 2.12 ``` 2. **架构验证** ```bash # 当前路径显示为 aarch64-linux-gnu # 确认与目标设备(RK3588)架构匹配 uname -m # 应输出 aarch64 ``` 3. **版本对应检查** ```bash # 查看Qt安装版本 qmake --version # 对比输出中的Qt版本是否包含 5.12.x 系列(对应Controls 2.12) ``` ⚠️ 问题判断依据: - 如果`qmldir`中没有`2.12`版本标注,说明安装的是旧版Controls - 缺少`Controls.2`子目录(新版Controls 2.x的典型结构) 🔧 解决方案建议: 1. **修复版本不匹配** ```bash # 卸载当前版本 sudo apt remove qml-module-qtquick-controls # 安装指定版本(以Ubuntu 20.04为例) sudo apt install qml-module-qtquick-controls2=5.12.8+dfsg-0ubuntu1 ``` 2. **部署缺失的Controls 2.x模块** ```bash # 手动创建新版目录结构 sudo mkdir -p /usr/lib/aarch64-linux-gnu/qt5/qml/QtQuick/Controls.2 sudo cp -r /path/to/correct/version/* /usr/lib/aarch64-linux-gnu/qt5/qml/QtQuick/ ``` 3. **环境变量调试** ```bash # 临时添加QML路径测试 export QML2_IMPORT_PATH=/usr/lib/aarch64-linux-gnu/qt5/qml ./rk3588 -platform linuxfb ``` 💡 技术细节说明: - `.qmlc`文件是Qt Quick Compiler生成的预编译文件,可提升加载速度 - `libqtquickcontrolsplugin.so`是核心插件,若损坏会导致所有控件失效 - `plugins.qmltypes`文件定义了QML组件与C++后端的类型映射 📌 验证成功的标志: ``` 部署后目录应包含: QtQuick/ ├── Controls/ # 原始Controls 1.x └── Controls.2/ # Controls 2.x(含2.12版本) ``` 如果仍存在问题,建议检查RK3588设备的`/usr/lib/qt5/qml`路径是否存在完整模块,或考虑重新交叉编译Qt 5.12.8并指定`-qmlimport`参数指向正确路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值