如何正确使用 QQuickItem::stackBefore() 在 GridLayout 中对项目重新排序
How to properly use QQuickItem::stackBefore() to reorder items in GridLayout?
我在混合 QML 和 C++ 方面有相当丰富的经验,但最近遇到了麻烦:我在QML代码中有GridLayout项目。最初,我用 C++ 中的 QQuickItems(实际上包含图标的矩形)填充它。这可以正常工作并呈现,包括大小调整、在 QML 定义的列上换行:属性等。
现在我需要基于用户交互(鼠标单击矩形)在确切位置插入新矩形(实际上就在单击的矩形之前)。我对 MouseEvent 传播没有问题,我什至能够将任何参数集合(无论是值还是指向项目的指针)传递到我的方法进行处理。我只是找不到"c ++措辞"来使矩形真正重新排列。
我使用以下代码:
QQuickItem *icon = place(parent);
icon->stackBefore(insertBefore);
parent->update(); //(1)
GUI::programWindow->update(); //(2)
qDebug() << "tCHILDS:" << parent->childItems(); //(3)
parent 是指向从 QML 代码传递的 GridLayout 项的指针(已验证它是否指向预期位置)。place(parent) 是我的方法,它基于此对象加载正确的图标,生成周围的矩形并返回指向它的指针(即 *icon 实际上是矩形)。insertBefore 是指向同一 GridLayout 内其他矩形的指针(通过我的 onClick 处理程序的自定义信号传递)。仔细检查它是否是正确的网格布局项的子项。
现在我期望,矩形,首先作为最后一个 GridLayout 子级生成的,在预期的其他 Rect 和 GridLayout (知道,视觉子顺序已更改)将重新绘制新排列到屏幕上之前,它会"快速"传送。事实上,我面对新创建的矩形可见为最后一个网格布局项目。
有趣的是,第 (3) 行的输出显示了正确的,即子项的重新排序顺序。因此,父>子项()的输出顺序与屏幕上看到的顺序不同。注释的行(1)和(2)是我拼命尝试使GridLayout重新绘制,但没有出现明显的变化。
有没有人有重新排序 GridLayout 子级的经验?有没有其他更合适的方法来调用而不是stackBefore()?还是我错过了一些愚蠢的、立即可见的东西:)?
提前感谢您提供任何线索。
你触发了QQuickItem::update()
,但对于孩子来说,重新排序只需要调用 QQuickItem::p olish() 就足够了。根据场景图和渲染文档,QQuickItem::updatePolish()
是通过调用QQuickItem::polish()
final touch-up of items before they are rendered
来安排的。但是polish
事件应该安排在场景中最顶层的 QQuickItem 上,而不仅仅是父项目。
此外,在使用 QQuickItem::stackBefore 或 QQuickItem::stackAfter 时,您需要知道这两个重新排序的项目应该是同一父 QQuickItem 实例的子项。
如果要将QQuickItem
插入到子列表的末尾,因为它是新添加项的默认位置,因此可以使用 QQuickItem::setParentItem。
对于上面的摘要,最终实现可能如下所示:
bool insertChild(QQuickItem* item, int position, QQuickItem* parent, QQuickItem* topmostItem) {
if (!item || !parent || !topmostItem)
return false;
QList<QQuickItem*> children = parent->childItems();
if (children.size() && children.size() > position) {
QQuickItem* nextItem = children.at(position);
item->setParentItem(parent);
item->stackBefore(nextItem);
} else {
item->setParentItem(parent);
}
topmostItem->polish();
return true;
}
作为 QQuickItem::stackBefore 和 QQuickItem::stackAfter 的替代方案,可以单独使用 QQuickItem::setParentItem,但在这种情况下,复杂性是线性的:
...
QList<QQuickItem*> children = parent->childItems();
// Remove all children from parent from insert position and to the end
for (int index = position; index < children.size(); ++index) {
children[index]->setParentItem(nullptr);
}
// Push back new QQuickItem into parent
item->setParentItem(parent);
// Push back into parent all previously temporary removed children
for (int index = position; index < children.size(); ++index) {
children[index]->setParentItem(parent);
}
topmostItem->polish();
...
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 错误-我无法在VS2019中打开新的Qt项目
- 我的快速排序在对预排序的项目进行排序时失败,如何改进?
- 类(可能是代理)的命名,允许在不修改基础容器的情况下对项目进行排序和删除
- 如何编译和运行一个新的 C++ Actor 框架项目?
- 无法在 Visual Studio 中创建新项目
- 如何在不创建新配置的情况下对两个不同解决方案使用的一个项目使用不同的 #defines
- 每次都构建(make)lib,只有在lib较新时才重新编译项目
- 在Clion的新窗口中创建一个新项目
- 如何按姓氏排序并打印新数组
- 如何修改函数以按C++的排序顺序插入每个项目
- 将一个数组的每个元素乘以另一个数组的每个元素,并对新的非常大的数组进行排序
- 创建新的 Visual Studio c++ 项目时出错
- 将矢量与其中的类项目进行排序
- 如何正确使用 QQuickItem::stackBefore() 在 GridLayout 中对项目重新排序
- 如何在 MFC 的 CListCtrl 中对项目进行排序
- 按选中状态对 QListWidget 中的项目进行排序
- 如何简单地按字母顺序对wxListCtrl的项目进行排序
- C++按属性对项目进行排序
- 创建没有重复项的新排序向量