gpt4 book ai didi

c++ - 启动时强制连接尚不可见的 QML 项的信号/槽

转载 作者:行者123 更新时间:2023-11-28 02:13:59 30 4
gpt4 key购买 nike

在用于编写 GUI 代码的 Qt 的 QML 语言中,QML 元素(如果我理解正确的话)在它们变得可见之前不会被实际创建。 (编辑: 听起来这些元素是在 QML 引擎加载它们时创建的,但看起来信号/槽连接不会建立,除非元素可见.)

我有一些 QML 元素(来自 QtChartsLineSeries 对象)随时间记录一些数据,我希望它们在我的应用程序启动后立即开始记录数据,即使包含每个系列的 ChartView 元素不会立即可见(用户必须导航到包含这些元素的页面)。

这可能吗?

一种方法可能是将每个数据系列本身保存在某种 QVariantList 中,其中包含全局 QML 对象中的 QPointF,然后将其动态分配给所需的 LineSeries 对象,当父 ChartView 被实例化时。这可能使用 ChartView::createSeries 是可能的,尽管我相信填充新系列的唯一方法是调用 ChartView::series() 并将其传递给我的 C++ 后端中的某种 Q_INVOKABLE 方法将填充系列。

编辑: 不确定这是否相关,但我用于导航的 GUI 元素(即 ChartView 在启动时不可见的原因)是一个 TabViewChartView 对象不是顶级 TabView 页面;他们低了几级。

编辑 2: 下面的答案似乎应该 有效,但是当我尝试时,我得到了相当无用的错误 TypeError: Type error实现它。我有 put together a minimal (non-)working example here (使用 qmlscene 运行它;我使用的是 Qt 5.5)。

编辑 3: 上面的非工作版本是 fixed by simply adding a property alias ,感谢 Mitch 的回答和评论。

最佳答案

一旦 QML 引擎加载了它们所在的 QML,Qt Quick 中的项目就会被创建(即使它们默认为不可见)。此规则的异常(exception)是动态加载其内容的项目,如 Loader

在您的编辑中,您说您正在使用 TabView。我认为您的设置是这样的:

import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2

ApplicationWindow {
title: qsTr("Hello World")
width: 800
height: 700
visible: true

TabView {
id: sv
anchors.fill: parent

Tab {
title: "Page 1"
}

Tab {
title: "Page 2"
ChartView {}
}
}
}

试着把它改成这样:

import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2

ApplicationWindow {
title: qsTr("Hello World")
width: 800
height: 700
visible: true

ChartView {
id: chartView
color: "red"
anchors.fill: parent
visible: false

Component.onCompleted: print("Monitoring data...")
}

TabView {
id: sv
anchors.fill: parent

Tab {
id: tab1
title: "Page 1"
}

Tab {
id: tab2
title: "Page 2"
onActiveChanged: {
if (active) {
chartView.parent = tab2;
chartView.visible = true;
}
}
}
}
}

Tabbasically just Loaders ,因此它们拥有所有 Loader 的 API,包括 active 属性。该属性让您知道该选项卡何时加载。在那个阶段之前,它是不可访问的。

When the tab becomes active, we reparent the ChartView to it so that it's displayed in the correct place, and then show it.

从调试输出中可以看出,ChartView 是在启动时创建的。您可以将它移动到其他地方以控制何时加载它,或者...使用 Loader。 :)

编辑:根据这个答案和评论中的讨论,OP 创建了一个 small working example这演示了如何预加载和重新设置持久项。

关于c++ - 启动时强制连接尚不可见的 QML 项的信号/槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34640095/

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