精华内容
下载资源
问答
  • 数独游戏 这是在QMLQtQuick)上编写的名为Sudoku的游戏的实现。 界面
  • QMLQtQuick简介以及QML实例 一、QMLQtQuick简介 从 Qt 4.7 开始,Qt 引入了一种声明式脚本语言,称为 QMLQt Meta Language 或者 Qt Modeling Language),作为 C++ 语言的一种替代。而 Qt Quick 就是使用 QML ...

    QML和QtQuick简介以及QML实例

    一、QML和QtQuick简介

    从 Qt 4.7 开始,Qt 引入了一种声明式脚本语言,称为 QML(Qt Meta Language 或者 Qt Modeling Language),作为 C++ 语言的一种替代。而 Qt Quick 就是使用 QML 构建的一套类库。 QML 是一种基于 JavaScript 的声明式语言

    在 Qt 5 中, QML 有了长足进步,并且同 C++ 并列成为 Qt 的首选编程语言。也就是说,使用 Qt 5,我们不仅可以使用 C++ 开发 Qt 程序,而且可以使用 QML。虽然 QML 是解释型语言,性能要比 C++ 低一些,但是新版 QML 使用 V8,Qt 5.2 又引入了专为 QML 优化的 V4 引擎,使得其性能不再有明显降低。在 Nokia 发布 Qt 4.7 的时候,QML 被用于开发手机应用程序,全面支持触摸操作、流畅的动画效果等。但是在 Qt 5 中,QML 已经不仅限于开发手机应用,也可以用户开发传统的桌面程序。

    QML 文档描述了一个对象树。QML 元素包含了其构造块、图形元素(矩形、图片等)和行为(例如动画、切换等)。这些 QML 元素按照一定的嵌套关系构成复杂的组件,供用户交互。
    ——摘自《Qt学习之路2》

    二、新建项目举例

    1、新建工程

    选择Application----Qt Quick Application

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2、建好的工程目录

    在这里插入图片描述

    3、main.qml内容

    import QtQuick 2.6
    import QtQuick.Window 2.2
    
    Window {
        visible: true
        width: 640
        height: 480
        title: qsTr("Hello World")
    
    	//鼠标事件
        MouseArea {
            anchors.fill: parent
            onClicked: {
                console.log(qsTr('Clicked on background. Text: "' + textEdit.text + '"'))
            }
        }
    
    	//输入编辑框
        TextEdit {
            id: textEdit
            text: qsTr("Enter some text...")
            verticalAlignment: Text.AlignVCenter
            anchors.top: parent.top
            anchors.topMargin: 20
            anchors.horizontalCenter: parent.horizontalCenter
            Rectangle {
                anchors.fill: parent
                anchors.margins: -10
                color: "transparent"
                border.width: 1
            }
        }
    }
    

    如上述代码所示,一个 QML 文档分为 importdeclaration 两部分。前者用于引入文档中所需要的组件(有可能是类库,也可以是一个 JavaScript 文件或者另外的 QML 文件);后者用于声明本文档中的 QML 元素

    每一个 QML 有且只有一个根元素,类似于 XML 文档。这个根元素就是这个 QML 文档中定义的 QML 元素,在这个例子中就是一个 Window 对象。注意一下这个 QML 文档的具体语法,非常类似于 JSON 的定义,使用键值对的形式区分元素属性。所以我们能够很清楚看到,我们定义了一个窗口,可见性为真,宽度为 640像素,高度为 480像素。

    QML 文档定义了一个对象树,所以 QML 文档中元素是可以嵌套的。在这个窗口中,我们又增加了一个 TextEdit 元素,顾名思义,就是一个文本编辑框。Text 显示的是 Enter some text… 字符串,而这个字符串是由 qsTr()函数返回的。qsTr()函数就是 QObject::tr()函数的 QML 版本,用于返回可翻译的字符串。TextEdit 的位置则是由锚点(anchor)定义。示例中的 TextEdit 位置定义为 parent 水平中心,其中 parent 属性就是这个元素所在的外部的元素,anchors.horizontalCenter: parent.horizontalCenter。距离parent的顶部10个像素点。

    同理,我们可以看到MouseArea 是充满父元素的。MouseArea 还有一个 onClicked 属性。这是一个回调,也就是鼠标点击事件。 MouseArea可以看作是可以相应鼠标事件的区域。当点击事件发出时,就会执行 onClicked 中的代码。注意我们的 MouseArea充满整个矩形anchors.fill: parent,所以整个区域都可以接受鼠标事件。
    console.log(qsTr('Clicked on background. Text: "' + textEdit.text + '"')) 表示在应用程序窗口输出()中的内容
    在这里插入图片描述

    参考:
    https://blog.csdn.net/qq_40194498/article/details/79849807

    展开全文
  • QML入门教程:一、QMLQtQuick简介以及QML实例

    万次阅读 多人点赞 2018-04-08 11:44:09
    Qt 4.7 开始,Qt 引入了一种声明式脚本语言,称为 QMLQt Meta Language 或者 Qt Modeling Language),作为 C++ 语言的一种替代。而 Qt Quick 就是使用 QML 构建的一套类库。 QML 是一种基于 JavaScript 的声明...

    从 Qt 4.7 开始,Qt 引入了一种声明式脚本语言,称为 QML(Qt Meta Language 或者 Qt Modeling Language),作为 C++ 语言的一种替代。而 Qt Quick 就是使用 QML 构建的一套类库QML 是一种基于 JavaScript 的声明式语言。在 Qt 5 中, QML 有了长足进步,并且同 C++ 并列成为 Qt 的首选编程语言。也就是说,使用 Qt 5,我们不仅可以使用 C++ 开发 Qt 程序,而且可以使用 QML。虽然 QML 是解释型语言,性能要比 C++ 低一些,但是新版 QML 使用 V8,Qt 5.2 又引入了专为 QML 优化的 V4 引擎,使得其性能不再有明显降低。在 Nokia 发布 Qt 4.7 的时候,QML 被用于开发手机应用程序,全面支持触摸操作、流畅的动画效果等。但是在 Qt 5 中,QML 已经不仅限于开发手机应用,也可以用户开发传统的桌面程序。
    QML 文档描述了一个对象树。QML 元素包含了其构造块、图形元素(矩形、图片等)和行为(例如动画、切换等)。这些 QML 元素按照一定的嵌套关系构成复杂的组件,供用户交互。
    ——摘自《Qt学习之路2》

    helloworld实例:

    新建项目如图:
    这里写图片描述
    选择Qt Quick Application,组件选择Qt Quick 2.1
    这里写图片描述
    创建项目成功之后,Qt会为我们自动生成一系列文件:
    这里写图片描述

    我们真正需要关注的是:main.qml 里面的内容

    import QtQuick 2.1
    import QtQuick.Window 2.0
    
    Window {
        visible: true
        width: 360
        height: 360
    
        MouseArea {
            anchors.fill: parent
            onClicked: {
                Qt.quit();
            }
        }
    
        Text {
            text: qsTr("Hello World")
            anchors.centerIn: parent
        }
    }
    

    如上述代码所示,一个 QML 文档分为 import 和 declaration 两部分。前者用于引入文档中所需要的组件(有可能是类库,也可以是一个 JavaScript 文件或者另外的 QML 文件);后者用于声明本文档中的 QML 元素。
    每一个 QML 有且只有一个根元素,类似于 XML 文档。这个根元素就是这个 QML 文档中定义的 QML 元素,在这个例子中就是一个 Window 对象。注意一下这个 QML 文档的具体语法,非常类似于 JSON 的定义,使用键值对的形式区分元素属性。所以我们能够很清楚看到,我们定义了一个窗口,可见性为真,宽度为 360 像素,高度为 360 像素。记得我们说过,QML 文档定义了一个对象树,所以 QML 文档中元素是可以嵌套的。在这个窗口中,我们又增加了一个 Text 元素,顾名思义,就是一个文本。Text 显示的是 Hello World 字符串,而这个字符串是由 qsTr()函数返回的。qsTr()函数就是 QObject::tr()函数的 QML 版本,用于返回可翻译的字符串。Text 的位置则是由锚点(anchor)定义。示例中的 Text 位置定义为 parent 中心,其中 parent 属性就是这个元素所在的外部的元素。anchors.centerIn: parent同理,我们可以看到MouseArea 是充满父元素的。MouseArea 还有一个 onClicked 属性。这是一个回调,也就是鼠标点击事件。 MouseArea可以看作是可以相应鼠标事件的区域。当点击事件发出时,就会执行 onClicked 中的代码。这段代码其实是让整个程序退出。注意我们的 MouseArea充满整个矩形anchors.fill: parent,所以整个区域都可以接受鼠标事件。
    运行效果示例:
    这里写图片描述
    接下来我们可以改变 main.qml 文件中的“Hello World”字符串,不重新编译直接运行,就会看到运行结果也会相应的变化。这说明 QML 文档是运行时解释的,不需要经过编译。所以,利用 QML 的解释执行的特性,QML 尤其适合于快速开发和原型建模。另外,由于QML 比 C++ 简单很多,所以 QML 也适用于提供插件等机制。

    展开全文
  • QMLQt Widgets 相结合

    万次阅读 多人点赞 2017-08-10 11:25:55
    在使用 Qt Widgets 时,经常要实现一些比较炫酷的效果(例如:滑动、翻页),这时选择 QML 会显得非常简单。 那么,问题来了: - 能不能将 QMLQt Widgets 结合在一起使用? - 如果能,都有什么方式? - QML 和...

    简述

    在使用 Qt Widgets 时,经常要实现一些比较炫酷的效果(例如:滑动、翻页),这时选择 QML 会显得非常简单。

    那么,问题来了:

    • 能不能将 QML 和 Qt Widgets 结合在一起使用?
    • 如果能,都有什么方式?
    • QML 和 Qt Widgets 之间又该如何交互?

    | 版权声明:一去、二三里,未经博主允许不得转载。

    一个简单的 QML

    创建了一个简单的 QML 文件,用于显示一个绿色的矩形,其中包含一个文本。为了说明 QML 与 Qt Widgets 的交互,在矩形中添加了两个信号。

    import QtQuick 2.1
    
    Rectangle {
        id: root
        color: "green"
        width: 200
        height: 200
    
        // 发送给 Qt Widgets 的信号
        signal qmlSignal
        // 从 Qt Widgets 接收到的信号
        signal cSignal
    
        Text {
            id: myText
            text: "Click me"
            font.pointSize: 14
            anchors.centerIn: parent
        }
    
        MouseArea {
            anchors.fill: parent
            onClicked: qmlSignal()
        }
    
        // 信号处理程序(处理从 Qt Widgets 接收到的信号)
        onCSignal: {
            root.color = "blue"
            myText.text = "Call the qml signal handler"
        }
    }

    如果需要,可以将像往常一样使用 qmlscene 来运行。

    加载和显示 QML

    要加载和显示 QML,可以使用以下两种方式:

    • QQuickWidget
    • QQuickView

    无论使用哪种方式,一旦主源文件的 URL 被指定,都将自动加载和显示 QML 视图。

    注意:QML运行环境 中,还介绍了另一种方式 - QQmlEngine + QQmlComponent,但是这种方式不能以 view 的形式加载。

    使用 QQuickWidget

    QQuickWidget 是 Qt 5.3 中提供的一个类,继承自 QWidget,它是 QQuickWindow 一个很方便的包装器,用于显示 Qt Quick 用户界面。

    使用方式:

    QQuickWidget *view = new QQuickWidget;
    view->setSource(QUrl::fromLocalFile("myqmlfile.qml"));
    view->show();

    使用 QQuickView

    QQuickView 是 Qt 5.0 中提供的一个类,继承自 QQuickWindow(继承自 QWindow),用于显示 Qt Quick 用户界面。

    使用方式:

    QQuickView *view = new QQuickView;
    view->setSource(QUrl::fromLocalFile("myqmlfile.qml"));
    view->show();

    可以看到,两者的使用方式几乎没什么区别。但是,QQuickWidget 基于 QWidget,而 QQuickView 基于 QWindow,所以需要将其转换为 QWidget,才能与 Qt Widgets 相结合。

    这样,就需要再引入一个函数:

    [static] QWidget *QWidget::createWindowContainer(QWindow *window, QWidget *parent = Q_NULLPTR, Qt::WindowFlags flags = Qt::WindowFlags())

    该函数用于创建一个 QWidget,可以将 window 嵌入到基于 QWidget 的应用程序中。

    所以,要将 QQuickView 转为 QWidget,可以使用下述方式:

    QQuickView *view = new QQuickView();
    QWidget *widget = QWidget::createWindowContainer(view, this);
    view->setSource(QUrl("qrc:/main.qml"));

    将 QML 与 Qt Widgets 相结合

    当一切准备就绪,就可以将 QML 与 Qt Widgets 完美结合在一起了:

    最终效果:

    QML 与 Qt Widgets

    源码如下:

    #include "widget.h"
    #include <QQuickView>
    #include <QVBoxLayout>
    #include <QQuickWidget>
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
    {
        resize(300, 300);
    
        // 方式一
        // QQuickView *pView = new QQuickView();
        // QWidget *pWidget = QWidget::createWindowContainer(pView, this);
        // pView->setResizeMode(QQuickView::SizeRootObjectToView);
        // pView->setSource(QUrl("qrc:/main.qml"));
    
        // 方式二
        QQuickWidget *pWidget = new QQuickWidget();
        pWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);
        pWidget->setSource(QUrl("qrc:/main.qml"));
    
        m_pButton = new QPushButton(this);
        m_pButton->setText("Qt Widgets...");
    
        QVBoxLayout *pLayout = new QVBoxLayout();
        pLayout->addWidget(pWidget);
        pLayout->addWidget(m_pButton);
        pLayout->setSpacing(10);
        pLayout->setContentsMargins(10, 10, 10, 10);
        setLayout(pLayout);
    
        // QML 与 Qt Widgets 通信
        // QObject *pRoot = (QObject*)pView->rootObject();
        QObject *pRoot = (QObject*)pWidget->rootObject();
        if (pRoot != NULL) {
            connect(pRoot, SIGNAL(qmlSignal()), this, SLOT(receiveFromQml()));
            connect(m_pButton, SIGNAL(clicked(bool)), pRoot, SIGNAL(cSignal()));
        }
    }
    
    void Widget::receiveFromQml()
    {
        m_pButton->setText("Call the C++ slot");
    }

    结合之后,少不了通信,这里采用信号槽的方式,通过 QML 的根元素 root 来发送和接收信号。

    展开全文
  • 介绍 QML和 C++对象可以通过,signals,slots和 属性...对于一个C++对象,任何数据都可以通过Qt的 Meta-Object System暴露给QML(何总方法,后面介绍),同时,任何的QML对象数据通过Meta-object system在C++端

    转自http://blog.sina.com.cn/s/blog_5106eff10100uto8.html

    介绍

    QML和 C++对象可以通过,signals,slots和 属性修改进行交互。对于一个C++对象,任何数据都可以通过Qt的 Meta-Object System暴露给QML(何总方法,后面介绍),同时,任何的QML对象数据通过Meta-object system在C++端直接访问。
    在实际的项目中很多地方会用到QML与Qt C++交互。在这里总结了若干方法供大家参考,欢迎大家指导和拍砖。

    在这里不外乎有三种方法:
    1. 把Qt C++中的对象或类型暴露给 QML端,供QML端使用。(官方说法是“嵌入”而非“暴露”,比较文明。- -b)
    2. QML中的Signal Handler(相当于Qt C++发送信号给QML端,QML端的Signal Handler进行处理)。
    3. 在Qt C++端创建QML对象,既然对象都有了。那你想怎么样它就怎么样它呗。(没用过,看起来也不太实用,不过介绍介绍,有用过的同学留言哈)。

    好,我们开始吧~

    知识准备

    别急,让我们先来看看,一些东西,如果您都知道,可以跳过此节。
    QML API有三个主要成员——QDeclarativeEngineQDeclarativeComponentQDeclarativeContext

    QDeclarativeEngine提供了QML的运行环境。
    QDeclarativeComponent封装了QML Documents
    QDeclarativeContext允许程序使用QML组件显示数据。

    QML包含一个非常好用的API——QDeclarativeView。通过它,应用程序可以很方便的把QML组件嵌入到QGraphicsView中。QDeclarativeView主要用于在应用程序开发过程中进行快速原型开发。

    暴露Qt C++的对象或类型给QML

    创建需要暴露给QML的数据类型

    #ifndef MYCLASS_H
    #define MYCLASS_H
    #include <QObject>
    #include <QString>
    class MyClass : public QObject
    {
    Q_OBJECT
    Q_PROPERTY(QString myString READ myString WRITE setmyString NOTIFY myStringChanged)
    public:
    explicit MyClass(QObject *parent = 0);
    Q_INVOKABLE QString getMyString();
    signals:
    void myStringChanged();
    public slots:
    void setmyString(QString aString);
    QString myString();
    private:
    QString m_string;
    };
    #endif // MYCLASS_H

    若你想数据元素中的方法可以被QML直接调用有2种方法:
    1. 在函数申明前添加 Q_INVOKABLE 宏。
    2. 申明成public slots。

    QML可以直接访问改数据元素的属性,该属性由QPROPERTY所申明。
    具体实现请参考,示例代码。

    暴露已存在的Qt C++对象给QML

    //main.cpp
    MyClass myObj;
    QDeclarativeEngine *engine=viewer.engine();
    QDeclarativeContext *context=engine->rootContext();
    context->setContextProperty("myObjectExposeByCXProperty", &myObj);

    qml中可以直接使用myObjectExposeByCxProperty对象。

    //mainpage.qml
    ...
    Button{
    ...
    id:btn1
    ...
    text: qsTr("PROPERTY") 
    //此处调用myString为MyClass的QPROPERTY的属性不是方法,所以没有括号。
    onClicked: label.text=myObjectExposeByCXProperty.myString;
    }
    ...

    注册Qt C++类类型给QML

    另外一种方式是注册类型

    //main.cpp
    qmlRegisterType<MyClass>("RegisterMyType", 1, 0, "MyClassType");

    QML中这样使用

    //mainpage.qml
    ...
    import RegisterMyType 1.0
    Button{
    id:btn2
    ...
    text: qsTr("INOVKABLE")
    //此处调用的时INVOKABLE的方法,不是属性,所以有括号。
    onClicked: label.text=myclassExposeByRegType.getMyString();
    }
    //创建对象,由于QML是解释执行的,所以放后面也没什么关系。
    MyClassType
    {
    id:myclassExposeByRegType
    }

    步骤:
    1. 导入import。
    2. 创建对象。
    3. id直接使用。

    QML中的Signal Handler

    还是使用上面的那例子,在qml中点击按钮控件,改变其中对象的字符串,这时候在Qt C++中发送一个signal信号给qml端,qml端接收到使用signal handler响应,改变label2的值。具体代码如下。
    qml中修改string的值。

    //mainpage.qml
    Button{
    id:btn3
    text: qsTr("emit stringchanged signal")
    onClicked: myObjectExposeByCXProperty.myString="xxxxx"; 
    }

    Qt C++触发信号

    //myclass.cpp
    void MyClass::setmyString(QString aString)
    {
    if(aString==m_string)
    {
    return;
    }
    m_string=aString;
    emit myStringChanged();
    }

    连接signal handler响应

    //mainpage.qml
    Connections
    {
    target: myObjectExposeByCXProperty
    onMyStringChanged:label2.text="Signal handler received" 
    }

    Qt C++中直接调用QML的函数

    同样的QML的函数也可以被Qt C++端调用。
    所有的QML函数都通过meta-object system暴露Qt C++端,在Qt C++端可以使用QMetaObject::invokeMethod()方法直接调用。下面就是这样的一个例子。

    // MyItem.qml
    import QtQuick 1.0
    Item {
    function myQmlFunction(msg) {
    console.log("Got message:", msg)
    return "some return value"
    }
    }
    // main.cpp
    QDeclarativeEngine engine;
    QDeclarativeComponent component(&engine, "MyItem.qml");
    QObject *object = component.create();
    QVariant returnedValue;
    QVariant msg = "Hello from C++";
    QMetaObject::invokeMethod(object, "myQmlFunction",
    Q_RETURN_ARG(QVariant, returnedValue),
    Q_ARG(QVariant, msg));
    qDebug() << "QML function returned:" << returnedValue.toString();
    delete object;
    展开全文
  • QML, Qt C++混合编程

    2016-10-13 13:02:58
    介绍 QML和 C++对象可以通过,signals,slots和 属性修改进行交互。对于一个C++对象,任何数据都可以通过Qt的 ...在实际的项目中很多地方会用到QMLQt C++交互。在这里总结了若干方法供大家参考,欢迎大家指导和拍
  • 全面认识 Qt Widgets、QMLQt Quick

    千次阅读 2019-06-21 18:19:57
    Qt Widgets、QMLQt Quick ...呃 (⊙﹏⊙) ,简直了,傻傻分不清楚 !哈哈,没关系,来全面认识一下,也许还有一些你不知道的秘...
  • QML for QT 1

    千次阅读 2011-07-02 18:08:22
    QML for Qt编程概述 如果你之前没有学习过qt,那没关系,当然如果你之前结果过qt那更好,因为相对于qtqml还是有很大的不同,但是我今天想以类比法开始qml的学习,呵呵 原因你懂的,能找到这篇文章,这说明你肯定...
  • QMLQt C++ 交互机制探讨与总结 介绍 QML和 C++对象可以通过,signals,slots和 属性修改进行交互。对于一个C++对象,任何数据都可以通过Qt的 Meta-...在实际的项目中很多地方会用到QMLQt C++交互。在这里总结了若...
  • Qt 学习之路 2(76):QMLQtQuick 2

    千次阅读 2017-10-07 10:00:37
    前面我们已经了解了 Qt 的一部分内容。这部分内容全部集中在 C++ 方面。...事实上,从 Qt 4.7 开始,Qt 引入了一种声明式脚本语言,称为 QMLQt Meta Language 或者 Qt Modeling Language),作为 C++ 语言的
  • 近期学习Qt,记录下学习过程,以免忘记。操作环境 WIN7+Qt 5.12.0。 新建资源目录 controls,新建 RadioButton.qml文件。 RaidoButton包含三个可视...默认样式文件路径:$QTDIR/qml/QtQuick/Controls.2/RadioButt...
  • 解决:项目设置-Build-Enable QML debugging and profiling,打钩 问题:调试qml和c++混编程序,能够调试qml,无法调试C++代码,断点被跳过 解决:1、项目设置-Run- Debugging settings- Enable C++ 和 Enable QML都...
  • QtQuick 可以使用内置的 JavaScript 引擎加载相应的 JS 代码,使用起来特别方便。...1. 首先用Qt Creator新建项目,选择Qt Quick Controls 2 Application,命名项目… 2. 在资源文件qml.qrc中添
  • 前面我们已经了解了 Qt 的一部分内容。这部分内容全部集中在 C++ 方面。...事实上,从 Qt 4.7 开始,Qt 引入了一种声明式脚本语言,称为 QMLQt Meta Language 或者 Qt Modeling Language),作为 C+...
  • CQtDeployer 支持项目 如果您喜欢我们的工作,并且对您有所帮助,则可以官方页面上支持该项目。...示例:cqtdeployer -bin myApp -qmlDir〜/ MyAppProject / qml -qmake〜/ Qt / 5.12.4 / gcc_64 / bin / qmake清
  • Qt qml 下使QtCharts

    2021-05-06 15:55:46
    文章目录Qt Qml 下使用QtCharts1.1 引入文档1.2 在pro中包含 charts1.3 运行官方例子1.4 修改main文件1.5 手动拷贝 相关文件 Qt Qml 下使用QtCharts 先说场景,项目中需要用到QtCharts,所以就得搞一下了,最简单的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,337
精华内容 2,534
关键字:

qml项目qt