访问 javascript 文件中的全局 Qt 对象,QML

     2023-02-16     120

关键词:

【中文标题】访问 javascript 文件中的全局 Qt 对象,QML【英文标题】:Access global Qt object in javascript file, QML 【发布时间】:2018-10-13 12:41:59 【问题描述】:

我在我的一个 QML 文件中定义了这个创建组件并检查它是否准备就绪的 javascript 函数:

Item 
    id: lib

    function createCmpt(path) 
        var cmpt = Qt.createComponent(path)
        if (cmpt.status !== Component.Ready) 
            if (cmpt.status === Component.Error) 
                console.error("Error: " + cmpt.errorString())
            
            console.error("Error: component not ready, path: " + path)
            return null
        
        return cmpt
    

    ...

现在,我想在我的任何 .qml 文件中使用这个函数(全局使用)。我知道我可以在我的应用程序的根目录中声明这个函数(在我的例子中是ApplicationWindow)。但是有没有办法在单独的 javascript 文件中定义这个函数? 我试着这样做(qml.js):

.pragma library

function createCmpt(path) 
    var cmpt = Qt.createComponent(path)
    if (cmpt.status !== Component.Ready) 
        if (cmpt.status === Component.Error) 
            console.error("Error: " + cmpt.errorString())
        
        console.error("Error: component not ready, path: " + path)
        return null
    
    return cmpt

但这当然行不通,因为这似乎是 vanilla javascript,它不知道全局 Qt 对象。

关于如何在我的外部 js 文件中定义此函数的任何想法?

更新:我没有仔细阅读我的错误信息!似乎 javascript 确实知道全局 Qt 对象。但是,Component 不是。在official doc 中,我找到了一种将 qml 命名空间导入 javascript 文件的方法,并将代码重写为:

.pragma library

.import QtQml 2.11 as QtQml

function createCmpt(path) 
    var cmpt = Qt.createComponent(path)
    if (cmpt.status !== QtQml.Component.Ready) 
        if (cmpt.status === QtQml.Component.Error) 
            console.error("Error: " + cmpt.errorString())
        
        console.error("Error: component not ready, path: " + path)
        return null
    
    return cmpt

但是,现在我收到一个错误:QObject::startTimer: Timers cannot be started from another thread 我不知道该怎么处理它

【问题讨论】:

只使用单例。 【参考方案1】:

很抱歉回答我自己的问题,但我已经找到了解决方案。 我在问题更新中发布的代码已经是我所需要的:

// qml.js
.pragma library

.import QtQml 2.11 as QtQml

function createCmpt(path) 
    var cmpt = Qt.createComponent(path)
    if (cmpt.status !== QtQml.Component.Ready) 
        if (cmpt.status === QtQml.Component.Error) 
            console.error("Error: " + cmpt.errorString())
        
        console.error("Error: component not ready, path: " + path)
        return null
    
    return cmpt

计时器的错误消息不再出现,不确定它来自哪里(我同时做了一些其他的事情)。 所以现在可以了,我可以在我的专用 javascript 文件中使用带有导入的 Qt 东西 :)

【讨论】:

Javascript 和 ESLint 中的全局变量

】Javascript和ESLint中的全局变量【英文标题】:GlobalvariablesinJavascriptandESLint【发布时间】:2017-05-2322:50:17【问题描述】:我有多个javascript文件,并且我在一个文件中定义了一些全局变量,该文件先于其他文件加载。因此,在第一... 查看详情

Qt:从代码中的任何位置访问当前设置文件

】Qt:从代码中的任何位置访问当前设置文件【英文标题】:Qt:accessthecurrentsettingsfilefromanywhereinthecode【发布时间】:2020-05-1022:50:38【问题描述】:假设我有一个非qt对象。例如,QT仅静态日志处理程序。如何让这个文件处理程序... 查看详情

javascript中的全局变量来获取地理位置

】javascript中的全局变量来获取地理位置【英文标题】:globalvariableinjavascripttogetGeolocation【发布时间】:2012-07-2309:42:27【问题描述】:我正在使用以下代码访问黑莓设备的地理位置。它的工作并显示出期望的结果。但我想在这个... 查看详情

我在 JavaScript 文件顶部设置的“全局”变量无法被文件内更下方的函数访问

】我在JavaScript文件顶部设置的“全局”变量无法被文件内更下方的函数访问【英文标题】:A"global"variableIamsettingatthetopofmyJavaScriptfileisnotaccessibletofunctionsfurtherdownwithinthefile【发布时间】:2021-06-0319:29:31【问题描述】:我有... 查看详情

多线程设计,保护C++中的全局成员

...程序,重点是速度优化。我想要一些对不同线程具有只读访问权限的全局对象。在打开线程之前,我必须初始化全局对象并用数据填充它们。如何保护我的全局对象的集合函数,但仍可以从主函数访问?现在的示例代码:myCla 查看详情

从 C 中的另一个文件访问全局静态变量

】从C中的另一个文件访问全局静态变量【英文标题】:AccessaglobalstaticvariablefromanotherfileinC【发布时间】:2010-12-3016:45:34【问题描述】:在C语言中,我想访问文件范围之外的全局静态变量。让我知道最好的方法。其中一种方法是... 查看详情

使用 require 在 JavaScript 中访问匿名函数之外的全局变量

】使用require在JavaScript中访问匿名函数之外的全局变量【英文标题】:AccessglobalvariableoutsideofanonymousfunctioninJavaScriptusingrequire【发布时间】:2015-08-0820:06:11【问题描述】:我正在开发一个HTML5实时多人游戏,我有一个使用p2库运行... 查看详情

我创建了一个文件来访问所有全局变量。我无法访问 pyspark-sql 查询中定义的 UDF 中的全局变量

】我创建了一个文件来访问所有全局变量。我无法访问pyspark-sql查询中定义的UDF中的全局变量【英文标题】:Icreatedafiletoaccessalltheglobalvariables.IamunabletoaccessglobalvariableintheUDFsdefinedinpyspark-sqlqueries【发布时间】:2020-07-1520:46:34【问... 查看详情

访问 javascript 文件中的模型属性?

】访问javascript文件中的模型属性?【英文标题】:AccessaModelpropertyinajavascriptfile?【发布时间】:2011-11-2909:53:04【问题描述】:是否可以访问外部Javascript文件中的模型属性?例如在“somescript.js”文件中varcurrency=\'@Model.Currency\';alert... 查看详情

如何阻止对我的 JavaScript 文件的直接访问?

】如何阻止对我的JavaScript文件的直接访问?【英文标题】:HowcanIblockdirectaccesstomyJavaScriptfiles?【发布时间】:2011-09-1404:56:32【问题描述】:我使用Minify来缩小和缓存我的所有脚本请求。我只希望我的用户能够访问JavaScript文件的... 查看详情

访问全局数组会导致分段错误

】访问全局数组会导致分段错误【英文标题】:AccessingaglobalArraycausesasegmentationfault【发布时间】:2013-01-0223:35:11【问题描述】:我正在尝试执行一项分配,在该分配中我将使用多个线程对文件中的输入进行排序,但是当我尝试使... 查看详情

如何从 C++ 源文件访问 C 源文件中的全局变量

】如何从C++源文件访问C源文件中的全局变量【英文标题】:HowtoaccessglobalvariableinCsourcefilefromc++sourcefile【发布时间】:2017-10-2508:15:57【问题描述】:有一个很大的C文件,里面定义了很多字符串,在本地使用。我想从C++文件中访问... 查看详情

无法访问全局变量(Javascript)

】无法访问全局变量(Javascript)【英文标题】:Can\'taccessglobalvariables(Javascript)【发布时间】:2014-01-1701:59:34【问题描述】:varhours=document.getElementById("hrs").value;//Globalvariablesdeclaredvarmins=document.getElementById("min").value;varse 查看详情

javascript作用域学习笔记

1.作用域和作用域链在JavaScript中,函数也是对象。对一个函数,每一个能被该函数访问的上下文对象称为该函数的作用域。作用域中的所有属性和方法都能被该函数访问到。在下面的代码中,函数f1和f2的作用域为全局对象,而... 查看详情

如何访问javascript文件中的函数?

】如何访问javascript文件中的函数?【英文标题】:howtoaccessafunctioninsidethejavascriptfile?【发布时间】:2011-01-2810:13:01【问题描述】:我正在尝试访问js文件中的一个函数,如果单击了一个按钮,如何访问它?这是我的html以及js文件... 查看详情

Javascript中跨多个文件的全局变量

】Javascript中跨多个文件的全局变量【英文标题】:GlobalvariablesinJavascriptacrossmultiplefiles【发布时间】:2011-02-2508:13:16【问题描述】:我的一堆JavaScript代码位于一个名为helpers.js的外部文件中。在调用此JavaScript代码的HTML中,我发现... 查看详情

通过Qt中的程序对文本文件进行排序

】通过Qt中的程序对文本文件进行排序【英文标题】:SortingintextfilethroughprograminQt【发布时间】:2014-03-1018:19:57【问题描述】:我正在使用Qt5.2.1,我制作了一个程序,将一些值(如名称、编号、其他详细信息...)存储在一个文本... 查看详情

你将如何从 Qt 中另一个文件中的函数访问小部件?

】你将如何从Qt中另一个文件中的函数访问小部件?【英文标题】:HowwouldyouaccessawidgetfromafunctioninanotherfileinQt?【发布时间】:2011-06-1500:02:49【问题描述】:我正在开发一个项目,我一开始是在没有GUI的情况下制作它,但现在我正... 查看详情