问题标签 [qquickitem]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
398 浏览

qt - 如何测量 QML 项目自加载以来出现在屏幕上所用的时间?

从我更改 QML Loader 的sourcesourceComponent属性到视觉项目实际出现在屏幕上(被绘制)的那一刻,我如何测量经过的时间?

我已经尝试使用 statusChanged 和 Component.onCompleted 信号,但都不够准确 - 很容易看出实际时间要长得多。

0 投票
2 回答
118 浏览

qt - 如何将自定义对象分配给 sourceItem?

A 想可视化 MapQuickItem 取决于 if 条件。

我有两个自定义对象ClusterMarker是一个 Rectangle 和PromotionMarker这是一个 Image 对象。我想使用 sourceItem 属性将它们分配给 MapQuickItem(这是 MapItemView 的委托)。

这是我的做法:

但是现在我遇到了两个错误。第一个指向{id: c}: Expected token ':'的第一个括号,第二个指向: Unexpected token ':'

进行此分配的正确方法是什么?

0 投票
0 回答
58 浏览

c++ - 为什么缩放矩阵会导致顶点退出 QQuickItem 的边界?

我试图了解 QQuickItem 中 OpenGL ES 矢量着色器的行为。

我从“图形”示例开始,然后尝试将任意最小值和最大值的样本缩放到 QQuickItem 范围内(以实现简单的、GPU 加速的 y 轴自动缩放)。我认为缩放矩阵会有所帮助。

着色器采用一对(重合)顶点并为每个奇数顶点添加一个偏移量到 Y 轴(因此属性 t)。线条被绘制为 GL_TRIANGLE_STRIP 以模拟刻度线(简单的解决方案,即使它在垂直线的情况下留下间隙)。

这是我试图使场景尽可能简单的尝试。我在顶点着色器中添加了一个缩放矩阵(一半 x 和 y)。

我将修复顶点位置传递给 updateGeometry() 函数 (linenode.cpp),因此传递给着色器的第一个顶点对位于 (0, 0) 处,如下所示:

几何图形正确缩放,但在整个窗口区域内。如下图所示,比例线出现平移。据我了解,如果将缩放矩阵 mx 应用于 (0, 0),则位置将保持不变,因此在使用 qt_Matrix 转换后,该线的第一个点将位于 Item 的左上角。

我怀疑位于 (0, 0) 的顶点已传递给着色器,但我无法在文档中找到详细信息。在这种情况下,我不明白让 qt_Matrix 执行上下文到项目转换的意义。

顺便说一句,如果我将一半的坐标作为顶点传递给 updateGeometry(),则图形会正确缩放。

没有变换矩阵的图:

没有变换矩阵的图

在顶点着色器中应用变换矩阵的图形:

应用了变换矩阵的图

在 C++ 代码中直接应用于顶点的缩放图:

正确的图形:缩放应用于 C++ 代码中的顶点

我需要了解的是:

  • 为什么这条线没有在项目坐标内缩放?
  • 我有什么错误的假设吗?
  • 如果传递给着色器的顶点被平移,我如何在保持 QQuickItem 边界的同时缩放 (x, y) 对?
0 投票
1 回答
317 浏览

qt - 自定义 QQuickPaintedItem 中的渲染质量差

我在 QML 中创建了一个小型绘图应用程序,我创建了一个QQuickPaintedItem. 然后在 QML 中,我使用 aMouseArea将输入提供给我的班级。从那里我只需将鼠标位置存储在一个向量中,然后将收到的点绘制到一个QImageusing上QPainter(我使用一个简单的算法使用向量中的最后三个点绘制二次贝塞尔曲线)。然后我调用QQuickPainted::update()并在我的实现中QQuickPaintedItem::paint()绘制图像。现在程序可以正常工作了,但问题是这幅画的渲染效果很差(我已经在使用了QPainter::AntiAliasing)。下面有一张图片。如您所见,曲线不是很锐利,而且我可以看到斜线上的“像素”(当我用 OneNote 尝试同样的事情时,一切都变得平滑而美观)。

如果您想对其进行测试,这是我的 github 存储库中的完整示例(代码也在下面)。对此我能做些什么吗? 注释 2019-12-05 151210.png. 与onenote相同的图像

在 QML 中:

0 投票
1 回答
203 浏览

c++ - 要在屏幕上绘制一些小图块,我应该使用 QQuickItem 还是 QQuickPaintedItem?

本质上,我需要在内存中加载一个大小正好为 16K 的 4 色 tilemap,以每秒 3 次的速度对 2 个图块进行动画处理,然后将一些图块渲染到一个相当小的盒子中,我会说可能是 100 个左右在 QML/Qt Quick 中显示像素宽和可能 80 像素高(非常粗略地来自内存),我可能会使用该scale属性在 QML 中将其放大

无论如何,我对如何做到这一点有点不知所措,但我认为 C++ 是最好的选择,这对我来说很好,在研究之后我发现有 2 个主要选项,QQuickItem 和 QQuickPaintedItem。

现在我知道 QQuickPaintedItem 更老更慢,因为它首先在 CPU 中绘制,然后复制到视频卡,所以它不是最好的解决方案。最推荐的选项是使用 OpenGL 在图形卡上呈现的 QQuickItem。

但我不需要过分的东西,我的意思是我在这里处理 ~100 x 80 像素,没有线条或形状操作,没有着色器,没有这些。这只是一堆像素,所以我想知道使用 QQuickPaintedItem 是否会更好。

但是,我不知道所有这些可能还有另一种解决方案,在这种情况下我很想听听,也许有一种更简单的方法来解决所有这些问题。

任何帮助解决这个问题都会很棒,在此先感谢。

0 投票
1 回答
326 浏览

c++ - 构造函数中的 QQuickItem 父项为空

我有兴趣通过 c++ QQuickItem 访问 qml 父级的属性。我有一个名为 VisibleTag 的自定义 QQuick 项目,它扩展了 QQuickItem。任何包含此对象标记的 qml 项目,我想根据我在代码中设置的其他因素设置为可见或不可见,我出于此问题的目的临时删除了这些因素。但是,我遇到了一个问题,即我的父指针在构造时为空。

我希望让父指针指向 qml 的可视父项。在示例中,我希望 parent 指向 Rectangle opPic。

我是否误解了 QQuickItem 构造函数的工作原理?是否可以访问 qml 视觉父级?

0 投票
1 回答
385 浏览

qt - QML Flickable with TextArea:contentY 的属性绑定被覆盖 - 由谁覆盖?

我正在制作一个终端小部件。我希望在更新Flickable时向下滚动到最新的输入TextArea.text。我的代码如下所示。

当我运行它时,我看到contentY它在我的绑定设置后立即被覆盖:

我检查以确保我的绑定没有将其设置为 0。我尝试使用 调试绑定循环export QT_LOGGING_RULES="qt.qml.binding.removal.info=true",结果很干净。我查看了源代码,Flickable但我认为没有任何方法是罪魁祸首。

绑定contentY是做我想做的事情的正确方法吗?为什么我的绑定不被尊重?

0 投票
0 回答
83 浏览

c++ - 如何使用 C++ 为基于自定义“QQuickItem”类的某些属性设置动画?

众所周知,Scene Graph 具有特殊的多线程垂直同步感知渲染技术。
此外,QtQuick 具有使用QSG*前缀名称指定的特殊 C++ 类,强烈建议仅使用QQuickItem.

那么可以在类中使用常规(旧的?)C++ 动画框架QPropertyAnimationQQuickItem吗?

如何在不破坏场景图性能/规则的情况下为QQuickItem使用内部的某些属性设置动画?C++

谢谢

0 投票
1 回答
76 浏览

c++ - 为包含多个 QQuickPaintedItems 的 QQuickView 实现滚动

所以最近我开始了一个项目,我想在其中显示一个图表,显示不同数据集之间的关系。

该图由边和节点组成,而这两个类都继承了 QQuickPaintedItem 并覆盖了paint(QPainter*painter) 方法。我有另一个类,它将所有节点和边缘存储在两个 QList 中。当我想显示图表时,每个节点和边缘的绘制方法都会被调用并被绘制到 QQuickView 中。我通过为 QQuickView 设置一个 Qml 文件来做到这一点(重要:加载的 qml 文件与实际的图形无关,一切都是用 QQuickPaintedItem 的绘画方法绘制的,我没有将任何与图形相关的内容暴露给 Qml . Qml 文件用于显示图表的一些控件)并获取 QQuickView 的内容项(QQuickItem* from method contentItem())并将其设置为每个节点和边缘的父项。所有这些对我来说都很好。

现在我的问题是:我想要显示的一些图表比我想要显示它们的实际视图大,所以为了解决这个问题,我想为我的视图实现水平和垂直滚动。但是,由于我不能使用像 ListView 这样的预定义 Qml 布局,所以我没有找到任何似乎可以解决我的问题的方法。对于我的图表。

有谁知道我如何实现滚动?有没有办法为我的 QQuickView 实现这个,或者有没有办法将我的两个节点和边缘列表暴露给 Qml 并在那里实现滚动?

(如果您需要一些代码,请随时提出。我认为现在分享一些代码是没有意义的,因为我首先正在寻找如何处理这个主题的想法)。

谢谢!

0 投票
0 回答
66 浏览

c++ - 为什么 childrenRectChanged 没有发出,但调用 childrenRect “修复”它?

目标

我需要知道Foo的子类 的子类的集体几何形状何时以及如何QQuickItem变化。

问题

我已将 lambda 连接到QQuickItem::childrenRectChanged信号,但它从未发出。奇怪的是,如果我childrenRect在某个地方打电话,信号就会开始发出。childrenRect是一个 getter 方法,而不是一个 setter,所以我看不出这个“修复”的理由。

问题

为什么看似无关的调用“修复”了信号的发射,以及如何在不调用的情况下使其按预期工作childrenRect

可重现的例子

这是我准备演示该问题的示例:

Foo.h

该类在main.cpp中注册,如下所示:

并以下列方式在main.qml中使用:

编辑

的文档QQuickItem::childrenRect 说:

此属性保存项目子项的集体位置和大小。

如果您需要访问项的子项的集体几何图形以正确调整项的大小,则此属性很有用。

访问功能:

QRectF childrenRect()

然而,正如@Amfasis 在评论中提到的,这个方法不仅仅是一个简单的getter。这里是the code