QT入门笔记(二)qml设计和引入js

QML

从 Qt 4.7 开始,Qt 引入了一种声明式脚本语言,称为 QML(Qt Meta Language 或者 Qt Modeling Language),作为 C++ 语言的一种替代。

widget

Qt4 时代的主流就是传统部件(或叫控件)编程,所用的语言一般是 C++。 Qt5 诞生之时,正是手机移动设备蓬勃发展的时候,而传统的 C++ 部件编写的界面对手机应用程序非常方便,比如手机屏幕显示随意翻转, 这在传统桌面程序里基本遇不到,谁会将 22 寸显示器翻过来转过去呢。

为了适应手机移动应用开发, Qt5 将 QML 脚本编程提到与传统 C++ 部件编程相同的高度,力推 QML 界面编程,当然 QML 主要用于手机移动应用程序。 QML 包含大量使用手机移动设备的功能模块,比如基本部件(QtQuick 模块)、GPS 定位、渲染特效、蓝牙、NFC、WebkKit 等等。

QML 类似于网页设计的 HTML,是一种标记语言,我们可以借助 CSS 对它进行美化,也可以借助 JavaScript 进行交互。有 Web 开发经验的读者学习 QML 将非常轻松。

使用 QML 开发界面主要有以下几个优点:

  • QML 非常灵活,可以做出非常炫酷的效果,例如 QQ、360、迅雷等都不在话下。
  • QML 是标记语言,见名知意,非常容易编写和阅读,大大提高了开发和维护效率。
  • QML 界面简洁大气,有很多动画,适合移动端。
  • 不同平台下的 QML 使用相同的渲染机制,界面效果一致,不会随操作系统的不同而变化。

组件和定义函数

import QtQuick 2.15    //带入模块
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
//qml非常方便的和C++交互
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    //不可见的元素
    Column{
        //可视元素,实例对象
        Button {
            id: btn
            text:'btn jie'
            onClicked: showAddResult(add(10, 20))
                //console.log(add(10, 20))
                //console.log('btn click')
                //text = 'hello '

            //基本上属性的有一个属性变化的信号
            onTextChanged: {
                //console.log('new test', text)
            }

            function add(num1, num2){
                return num1 + num2
            }
            function showAddResult(result){
                console.log(result)
            }

        }
        //标签
        Label {
            text: btn.text
            color: 'red'
            font.pointSize: 20
        }
        //滑条,
        Slider {
            from: 1
            value: 25
            to: 100
        }
        //矩阵
        Rectangle{
            width: 100
            height: 100
            color: 'orange'
        }
    }
}

引入JS

demo1: 引入Js实现加法、减法

JieJs.js

/*
  这是一个js文件,它可以执行js代码,他的引擎应该是QV4。它只能支持的标准是es5
*/
//类的构造函数
function OperatorNumber(number) {
    this.number = number

    this.add = function(num){
        return number + num
    }

    this.sub = function(num){
        return number - num
    }
}

main.qml

import QtQuick 2.15    //带入模块
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
import './JieJs.js' as Jie //导入js文件
//qml非常方便的和C++交互
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")
    //不可见的元素
    Column{
        //可视元素,实例对象
        Button {
            id: btn
            text:'btn jie'
            //槽函数
            onClicked: {
                let oper = new Jie.OperatorNumber(88)
                console.log('add', oper.add(10))
                console.log('add', oper.sub(10))
            }
            //基本上属性的有一个属性变化的信号
            onTextChanged: {
                //console.log('new test', text)
            }
        }
    }
}

demo2: 点击按钮修改颜色

ps:Qt.rgba(rgb.red / 255, rgb.green /255, rgb.blue/255, 1.0) 中传入的颜色值需要小于1

JieJs.js

/*
  这是一个js文件,它可以执行js代码,他的引擎应该是QV4。它只能支持的标准是es5
  es7
*/

//类的构造函数
function OperatorNumber(number) {
    this.number = number

    this.add = function(num){
        return number + num
    }

    this.sub = function(num){
        return number - num
    }
}

function getRangeRadom(max){
    return Math.floor(Math.random() * max)
}

function getColorRandom(){
    let red = getRangeRadom(256)
    let green = getRangeRadom(256)
    let blue = getRangeRadom(256)

    return {red:red/255, green:green/255, blue:blue/255}
}

main.qml

import QtQuick 2.15    //带入模块
import QtQuick.Window 2.15
import QtQuick.Controls 2.15  //命名空间
import './JieJs.js' as Jie //导入js文件
//qml非常方便的和C++交互
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    // Z,设置同级项的堆叠顺序。缺省情况下,堆叠顺序为0。最大的在上面
    //按钮1
    Button{
        id: btn
        x: 0
        y: 0
        z: 1
        text: 'click1'
        onClicked: {
            let rgb = Jie.getColorRandom()
            console.log(JSON.stringify(rgb))
            rect.color =Qt.rgba(rgb.red / 255, rgb.green /255, rgb.blue/255, 1.0)
        }
    }
    Rectangle {
        id: rect
        x:btn.x
        y:btn.y + btn.height
        width: 200
        height: 200
        border.width: 1
        border.color: 'orange'

    }
}

demo3: 拖拽框

import QtQuick 2.15    //带入模块
import QtQuick.Window 2.15
import QtQuick.Controls 2.15  //命名空间
import './JieJs.js' as Jie //导入js文件
//qml非常方便的和C++交互
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")
    // Z,设置同级项的堆叠顺序。缺省情况下,堆叠顺序为0。最大的在上面
    //按钮1
    Button{
        id: btn
        x: 0
        y: 0
        z: 1
        text: 'click1'
        onClicked: {
            let rgb = Jie.getColorRandom()
            console.log(JSON.stringify(rgb))
            rect.color =Qt.rgba(rgb.red , rgb.green , rgb.blue, 1.0)
        }
        //鼠标区域
        MouseArea{
            anchors.fill :parent //parent
            drag.target: btn //目标是btn
        }
    }
    Rectangle {
        id: rect
        x:btn.x
        y:btn.y + btn.height
        width: 200
        height: 200
        border.width: 1
        border.color: 'orange'
    }
}

color rgba(real red, real green, real blue, real alpha)

js:ECMAScript 6.0(以下简称 ES6)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值