Qt QGraphicsScene缓慢添加项目

时间:2012-01-13 17:43:40

标签: c++ qt

我一直在尝试使用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中所述。我做了一件明显不对的事吗?

2 个答案:

答案 0 :(得分:4)

这个答案是针对问题下面的评论中提到的特定问题 - 静态网格,其中可以“选择”各种网格单元。

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

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

要观察鼠标事件,请继承QGraphicsScene子类并重新实现backgroundBrush property方法,您将处理某些鼠标事件以处理选择。您现在可以通过调用场景的eventFilter方法来安装此过滤器。

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

希望这是有道理的。

答案 1 :(得分:1)

itemIndexMethod设置为noIndex有助于项目插入效果。请参阅:For QGraphicsScene using setZValue on a QGraphicsItem causes major slowdown