4.qml单例模式

这里写目录标题

js文件单例模式

直接添加一个js文件到qml中

修改内容

TestA.qml

csharp 复制代码
import QtQuick 2.0
import QtQuick.Controls 2.12
import "./MyWork.js" as MW

Item {

    Row{
        TextField {
            onEditingFinished: {
                MW.setA(text)
            }
        }
        Button{
            onClicked: lb.text = MW.getA()
        }
        Label{
            id: lb
        }

    }

}

main.qml

cpp 复制代码
import QtQuick 2.12
import QtQuick.Window 2.12

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    TestA{
        width: parent.width
        height: 200

    }

    TestA{
        y:200
        width: parent.width
        height: 200
    }

}

很明显使用import引入的js文件数据是不共享的,也就是他们在qml中的体现为都是个实例

但是有的场景我们希望我们的js文件是一个单例,也就是数据是共享的,怎么做呢?

只需要在js文件最顶部加入一行

.pragma library

既可

MyWork.js

cpp 复制代码
.pragma library
var a = ""

function setA(v){
    a = v;
}

function getA() {
    return a;
}

总结:

有缺点,缺点就是定义的变量不会通知qml页面的变更

qml页面数据的刷新绑定的变量其实还是使用了qml的信号与槽的机制,而

js定义的变量没有ValueChanged这种信号, 故刷新不了qml页面

qml文件单例模式

而qml单例模式

需要在qml最上面加入这一行,没有逗号,跟js不一样

pragma Singleton

同时还要添加一个qmldir文件暴露此单例

总结

全局变量的使用,导致多个qml文件同时触发刷新,

哪怕那个页面不可见,大大拉低刷新性能

为此我们要确保管控好这些变量,

尽量不要让他们本身成功绑定值或者所在的方法成为绑定值(有值),

否则一旦此值变动都会触发左值的更新

cpp 复制代码
    Row{
        TextField {
            onEditingFinished: {
                TestB.setName(text)
            }
        }

        Text {
            visible:  false
            text: {
                console.log("11111")
                return TestB.name
            }
        }

        Text {
            text: {
                console.log("22222")
                return TestB.name
            }
        }
    }
相关推荐
一只大袋鼠2 小时前
并发编程(二十二):单例模式:从基础实现到 Spring Web 实战
java·spring·单例模式·并发编程
习惯就好zz1 天前
Qt Quick 系统托盘完整实践
开发语言·qt·qml·系统托盘·system tray·qapplication·qguiapplication
Real-Staok1 天前
(集合)C / C++ 设计模式综合
单例模式·设计模式·代理模式
我命由我123451 天前
Element Plus - 在 el-select 的每个选项右侧添加按钮
前端·javascript·vue.js·前端框架·ecmascript·html5·js
冉佳驹1 天前
C++11 ——— 线程库与单例模式的原理、实现及线程安全设计
c++·单例模式·饿汉模式·懒汉模式·c++线程库·c++互斥锁·c++条件变量
Yupureki2 天前
《C++实战项目-高并发内存池》4.CentralCache构造
c语言·开发语言·c++·单例模式·github
我命由我123452 天前
Element Plus - Cascader 观察记录(基本使用、动态加载、动态加载下的异常环境)
开发语言·前端·javascript·vue.js·typescript·html5·js
阿珊和她的猫2 天前
单例模式:确保唯一性与全局访问的设计方案
单例模式·状态模式
我命由我123452 天前
Element Plus - Form 的 resetField 方法观察记录
开发语言·前端·javascript·vue.js·html·html5·js
Yupureki3 天前
《C++实战项目-高并发内存池》5.PageCache构造
c语言·开发语言·c++·单例模式·github