gpt4 book ai didi

c++ - Qt QGraphicsScene 添加项目慢

转载 作者:搜寻专家 更新时间:2023-10-31 00:44:24 26 4
gpt4 key购买 nike

我一直在尝试使用 QGraphicsScene 使用以下代码创建可编辑的网格:

int w = 5;
int h = 5;
//QRect r(0, 0, w*1680, h*800);
//scene->setSceneRect(r);
//scene->setBspTreeDepth(5);
//scene->setItemIndexMethod(QGraphicsScene::NoIndex);
QTime t;
for(long i = 0; i < 800; ++i) {
t.restart();
for(long j = 0; j < 1680; ++j) {
QGraphicsItem *item = scene->addRect(j*w, i*h, w, h, pen, brush);
item->setFlag(QGraphicsItem::ItemIsSelectable, true);
}
qDebug() << "Elapsed Time: " << t.elapsed();
}
//scene->setItemIndexMethod(QGraphicsScene::BspTreeIndex);
setScene(scene);
//setSceneRect(0, 0, 200, 200);

从代码中可以看出,场景中大约有100万个矩形。如 Qt documentation 中所述,添加新项目的时间似乎呈多项式增长,而不是呈对数增长。 .我做错了什么吗?

最佳答案

此答案针对问题下方评论中提到的特定问题 - 可以“选择”各种网格单元的静态网格。

这里的关键思想是网格不可变形,并且单元格的选择是“罕见”的。想到的一个想法是定义 backgroundBrush property QGraphicsScene 为您绘制静态网格,可能使用简单的可平铺 QPixmap。这是有效的,因为它只是场景的背景并且不涉及动态对象。

要使单元格可选择,就是要监视场景中的鼠标事件,当用户单击场景中的某处时,您可以在适当的位置创建所需颜色的矩形。这使您基本上可以拥有一个可以选择任何单元格的无限网格。

要观察鼠标事件,继承QGraphicsScene 并重新实现eventFilter方法,您将在其中处理一些用于处理选择的鼠标事件。您现在可以通过调用 installEventFilter 安装此过滤器。你的场景的方法。

在您的 eventFilter 方法中,您基本上会留意鼠标事件,并根据它们的位置在场景中的适当位置创建新的彩色矩形。

希望这是有道理的。

关于c++ - Qt QGraphicsScene 添加项目慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8854863/

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