Qt QGraphicsScene медленное добавление элементов - PullRequest
2 голосов
/ 13 января 2012

Я пытался использовать 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);

Как видно из кода, в сцене примерно 1 миллион прямоугольников. Время добавления нового элемента, кажется, увеличивается полиномиально, а не логарифмически, как описано в документации Qt . Я делаю что-то явно не так?

Ответы [ 2 ]

4 голосов
/ 14 января 2012

Этот ответ направлен на конкретную проблему, упомянутую в комментариях под вопросом: статическая сетка, в которой можно «выбрать» различные ячейки сетки.

Ключевая идея здесь заключается в том, что сетка не деформируется , и выбор ячейки является "редким" случаем. Идея, которая приходит в голову, состоит в том, чтобы определить backgroundBrush свойство из QGraphicsScene, чтобы нарисовать статическую сетку для вас, возможно, используя простой способный тайл QPixmap. Это эффективно, так как это просто фон сцены и не содержит динамических объектов.

Сделать ячейки доступными для выбора - это следить за событиями мыши в сцене, и когда пользователь щелкает где-то в сцене, вы можете создать прямоугольник нужного цвета в соответствующем месте. Это позволяет вам по существу иметь бесконечную сетку, в которой может быть выбрана любая ячейка.

Чтобы наблюдать за событиями мыши, создайте подкласс QGraphicsScene и переопределите метод eventFilter, где вы будете обрабатывать некоторые события мыши для работы с выборками. Теперь вы можете установить этот фильтр, вызвав метод installEventFilter вашей сцены.

Внутри вашего метода eventFilter вы по существу будете следить за событиями мыши и в зависимости от их положения создавать новые цветные прямоугольники в соответствующем месте сцены.

Надеюсь, это имеет смысл.

1 голос
/ 13 января 2012

Настройка itemIndexMethod на noIndex помогает повысить эффективность вставки элемента.Смотрите: Для QGraphicsScene использование setZValue для QGraphicsItem вызывает значительное замедление

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...