You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QT 5.5中QML函数引用兄弟对象报错问题求助

Qt 5.5中兄弟组件引用引发的JS语法错误解决思路

问题描述

以下代码在Qt 5.15中可正常运行,但在Qt 5.5环境下,编译器提示getFontSize()函数的前三行缺少分号(实际已存在分号),核心原因是Qt 5.5的QML引擎在JS函数中访问兄弟组件invisibleText时存在支持局限。

原代码:

Text {
    id: invisibleText;
    text: mainText.text
    
    property bool fitWithinParent : true /* simplified, most likely irrelevant */
    
    property var referenceObject: (fitWithinParent)? parent : page /* page is a top level Window */
    property int baseFontSize : (referenceObject.height / 10) * 7
    font.family: currentFontName
    font.pointSize: baseFontSize
    color: "transparent"
}

Text {
    objectName: "numberText"
    id: mainText                                        
    text: ""
                            
    font.family: currentFontName

    function getFontSize() {
        let referenceObject = invisibleText.referenceObject; // Expected token ;
        let baseFontSize = invisibleText.baseFontSize;  // Expected token ;
        let fitFontSize = Math.min(baseFontSize, baseFontSize * ((invisibleText.paintedWidth > referenceObject.width)? (referenceObject.width / invisibleText.paintedWidth) : 1));  // Expected token ;

        if (mainText.text.slice(-1) == "A") {
            fitFontSize *= 0.94;
        }

        return fitFontSize * page.songNumberScaling;
    }

    font.pointSize: getFontSize();

    color: page.foregroundColor
}

解决思路及修改方案

1. 提前绑定兄弟组件引用

在mainText中新增属性绑定兄弟组件invisibleText,避免在JS函数中直接跨组件查找引用:

Text {
    objectName: "numberText"
    id: mainText                                        
    text: ""
                            
    font.family: currentFontName
    // 提前绑定兄弟组件引用
    property var invText: invisibleText

    function getFontSize() {
        // 改用绑定后的属性访问
        var referenceObject = invText.referenceObject;
        var baseFontSize = invText.baseFontSize;
        var fitFontSize = Math.min(baseFontSize, baseFontSize * ((invText.paintedWidth > referenceObject.width)? (referenceObject.width / invText.paintedWidth) : 1));

        if (mainText.text.slice(-1) == "A") {
            fitFontSize *= 0.94;
        }

        return fitFontSize * page.songNumberScaling;
    }

    font.pointSize: getFontSize();
    color: page.foregroundColor
}

2. 替换ES6 let为var

Qt 5.5的QML JS引擎对ES6语法支持不完善,将let替换为var可避免语法解析误报。

3. 改用QML属性绑定替代JS函数

直接将字体大小的计算逻辑写入font.pointSize的绑定表达式中,避开JS函数中访问兄弟组件的限制:

Text {
    objectName: "numberText"
    id: mainText                                        
    text: ""
                            
    font.family: currentFontName

    font.pointSize: {
        var refObj = invisibleText.referenceObject;
        var baseSize = invisibleText.baseFontSize;
        var fitSize = Math.min(baseSize, baseSize * ((invisibleText.paintedWidth > refObj.width) ? (refObj.width / invisibleText.paintedWidth) : 1));
        if (text.slice(-1) === "A") {
            fitSize *= 0.94;
        }
        return fitSize * page.songNumberScaling;
    }

    color: page.foregroundColor
}

4. 通过父组件代理属性

若两个Text组件有共同父组件,可将invisibleText的referenceObject、baseFontSize等属性迁移至父组件,让mainText直接访问父组件属性,彻底避免跨兄弟组件引用:

// 父组件示例
Item {
    property var referenceObject: (invisibleText.fitWithinParent)? parent : page
    property int baseFontSize: (referenceObject.height / 10) * 7

    Text {
        id: invisibleText;
        text: mainText.text
        property bool fitWithinParent : true
        font.family: currentFontName
        font.pointSize: parent.baseFontSize
        color: "transparent"
    }

    Text {
        objectName: "numberText"
        id: mainText                                        
        text: ""
        font.family: currentFontName
        font.pointSize: {
            var fitSize = Math.min(parent.baseFontSize, parent.baseFontSize * ((invisibleText.paintedWidth > parent.referenceObject.width) ? (parent.referenceObject.width / invisibleText.paintedWidth) : 1));
            if (text.slice(-1) === "A") fitSize *= 0.94;
            return fitSize * page.songNumberScaling;
        }
        color: page.foregroundColor
    }
}

内容的提问来源于stack exchange,提问作者Aros

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 08:37:33