如何评价QML?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何评价QML?相关的知识,希望对你有一定的参考价值。

参考技术A   QML是一种描述性的脚本语言,文件格式以.qml结尾。语法格式非常像CSS(参考后文具体例子),但又支持javascript形式的编程控制。我个人认为它结合了QtDesigner UI和QtScript的优点。QtDesigner可以设计出·ui界面文件,但是不支持和Qt原生C++代码的交互。QtScript可以和Qt原生代码进行交互,但是有一个缺点,如果要在脚本中创建一个继承于QObject的图形对象非常不方便,只能在Qt代码中创建图形对象,然后从QtScript中进行访问。而QML可以在脚本里创建图形对象,并且支持各种图形特效,以及状态机等,同时又能跟Qt写的C++代码进行方便的交互,使用起来非常方便。

PySide2 QML - 如何在另一个 QML 文件中引用 QML 文件作为组件?

【中文标题】PySide2 QML - 如何在另一个 QML 文件中引用 QML 文件作为组件?【英文标题】:PySide2 QML - How to reference QML file within another QML file as component? 【发布时间】:2018-12-06 14:37:11 【问题描述】:

我在同一个文件夹中有 3 个文件:

form.py

from __future__ import print_function
import sys, os

from PySide2.QtCore import QFile, QObject, QUrl
from PySide2.QtGui import QGuiApplication
from PySide2.QtQuick import QQuickView

if __name__ == '__main__':
    app = QGuiApplication(sys.argv)
    view = QQuickView()
    view.setResizeMode(QQuickView.SizeRootObjectToView)
    qmlFile = os.path.join(os.path.dirname(__file__), 'Main.qml')
    view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile)))
    if view.status() == QQuickView.Error:
        sys.exit(-1)
    view.show()

    app.exec_()
    del view

Main.qml

import QtQuick 2.10

Item 
    width: 200
    height: 200

    ListModel
    
        id: myModel
        ListElement  type: "Dog"; age: 8 
        ListElement  type: "Cat"; age: 5 
    

    ListView 
        anchors.fill: parent
        model: myModel
        delegate: MyDelegate
    

MyDelegate.qml

import QtQuick 2.10

Component 
    id: myDelegate
    Text  text: type + ", " + age 

运行 form.py 应该会给我一个带有 ListView 和两个元素的窗口。此代码取自 official tutorial 并进行了更改,因此我可以看到在其他 QML 文件中引用 QML 文件是如何工作的。我得到的只是一个白色窗口,所以我猜想Main.qml 没有加载代理。

MyDelegate.qml 的第一个字母是大写的,所以Main.qml 应该会自动加载委托。我期待这种行为,因为它是问题的解决方案:Include another QML file from a QML file 在许多教程中,包括一些针对 PyQt5 的教程,我看到他们引用了其他类似的 QML 文件。 如果我将Component ... 部分复制到Main.qml 中并将ListView ... 中的委托引用从MyDelegate 更改为myDelegate,它就可以工作。

我想将任何 QML 节点外包到单独的文件中都会出现此问题。

PySide2 不支持这个功能,还是我必须在form.py 中做一些魔术让Main.qml 知道还有另一个 QML 文件要加载?

我安装了当前的***

pip install --index-url=http://download.qt.io/snapshots/ci/pyside/5.11/latest/ pyside2 --trusted-host download.qt.io

来自安装 Python 3.6 的 Windows 10 64 位计算机上的 official wiki。

【问题讨论】:

在您的 ListView 中,代表应该是:delegate: MyDelegate - 您缺少大括号 在您的MyDelegate.qml 中,Component 是不必要的。当您将其分配给 Component 类型的属性时,它将自动添加 错字:把delegate: MyDelegate改成delegate: MyDelegate 如果Component 是不必要的,我应该在MyDelegate.qml 中使用什么来代替?我必须用一些东西包围id:...text:... @AlfradS。只使用import QtQuick 2.10Text text: type + ", " + age 【参考方案1】:

感谢 derM 和 eyllanesc 指出 MyDelegate.qml 的参考文献中有错字。引用应带大括号delegate: MyDelegate

正确的 form.py 现在是:

import QtQuick 2.10

Item 
    width: 200
    height: 200

    ListModel
        id: myModel
        ListElement  type: "Dog"; age: 8 
        ListElement  type: "Cat"; age: 5 
    
    ListView 
        anchors.fill: parent
        model: myModel
        delegate: MyDelegate 
    

它甚至可以与在 MyModel.qml 中外包并引用为 model: MyModel myModel 一起使用

【讨论】:

以上是关于如何评价QML?的主要内容,如果未能解决你的问题,请参考以下文章

应该如何恰当的评价这个班级?(急急)

如何评价 Swift 语言?

如何评价ORB-SLAM3?

如何评价 Android L

如何评价 JetBrains 的新 C/C++ IDE CLion?

如何评价微软的orleans框架