gpt4 book ai didi

c++ - 检测到属性宽度的 QML 绑定(bind)循环(TextMetrics 行为很奇怪)

转载 作者:行者123 更新时间:2023-11-30 04:44:56 27 4
gpt4 key购买 nike

我遇到了绑定(bind)循环问题,代码确实有效,但我想摆脱这些警告。

如果我从 calculateMaxWidth() 函数返回一个常量值,则没有警告,但一旦我使用 TextMetrics,事情就会变得糟糕。有趣的是,对于 for 循环中的每个新循环,我都会收到越来越多的警告。如果我将 TextMetrics 创建与销毁一起放入 for 循环中,我会收到针对每个测量文本的单个警告。

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
id: theWindow
visible: true
width: 640
height: 480
title: qsTr("Binding loop! Why?")

property var mydata: ['somethinglonglikecucumber', 'tomato', 'potato']

function calculateMaxWidth() {
var maxWidth = 0;

var textMetrics = Qt.createQmlObject('import QtQuick 2.12; TextMetrics {} ', theWindow);
textMetrics.font.pixelSize = 12;

for(var i=0; i<mydata.length; i++) {
textMetrics.text = mydata[i];
console.log("width of " + textMetrics.text + " is " + textMetrics.width)
maxWidth = Math.max(maxWidth, textMetrics.width);
}

textMetrics.destroy();
return maxWidth;
}

Rectangle {
width: calculateMaxWidth()
height: 30 * mydata.length
color: "yellow"
}
}

这是默认的main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

QGuiApplication app(argc, argv);

QQmlApplicationEngine engine;
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);

return app.exec();
}

qrc:/main.qml:29:5: QML 矩形:检测到属性“width”的绑定(bind)循环

最佳答案

分配给 TextMetrics/FontMetrics 属性会以某种方式导致绑定(bind)循环警告。但是,查询 FontMetrics 的 boundingRect 不会创建分配,因此不会出现警告。此外,在创建 FontMetrics 对象期间,我还必须将字体大小作为属性绑定(bind)传递。

import QtQuick 2.12
import QtQuick.Window 2.12

Window {
id: theWindow
visible: true
width: 640
height: 480
title: qsTr("Binding loop solved!")

property var mydata: ['somethinglonglikecucumber', 'tomato', 'potato']

function calculateMaxWidth(pixelSize) {
var maxVal = 0;

var fontMetrics = Qt.createQmlObject('import QtQuick 2.12; FontMetrics {font.pixelSize:' + pixelSize + '}', theWindow);

for(var i=0; i<mydata.length; i++) {
maxVal = Math.max(maxVal, fontMetrics.boundingRect(mydata[i]).width);
}

fontMetrics.destroy();

return maxVal;
}

Rectangle {
width: calculateMaxWidth(55)
height: 30 * mydata.length
color: "yellow"
}
}

关于c++ - 检测到属性宽度的 QML 绑定(bind)循环(TextMetrics 行为很奇怪),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57475076/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com