Russian Qt Forum
Ноябрь 23, 2024, 21:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как лучше отобразить сетку на QGraphicsScene?  (Прочитано 11210 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Август 31, 2011, 15:58 »

Нужно в режиме редактирования рисовать сетку на сцене, поверх которой будут размещаться элементы и выравниваться по ней.
Как сделать грамотно сетку, я делал так
Код:

QList<QGraphicsLineItem*>   *   fhorizontalLines;
QList<QGraphicsLineItem*>   *   fverticalLines;

void            QEditorScene::removeGrid()
{
    QGraphicsLineItem * item;

    for(QList<QGraphicsLineItem*>::iterator it = fhorizontalLines->begin(); it!= fhorizontalLines->end(); it++)
    {
        item = *it;
        this->removeItem(item);
        delete item;
    }

    for(QList<QGraphicsLineItem*>::iterator it = fverticalLines->begin(); it!= fverticalLines->end(); it++)
    {
        item = *it;
        this->removeItem(item);
        delete item;
    }

    fhorizontalLines->clear();
    fverticalLines->clear();
}

void            QEditorScene::createGrid(int xmax, int x_step, int ymax, int y_step)
{
    QPen pen;

    QColor  gridColor = Qt::white;
    gridColor.setAlpha(100);
    pen.setColor(gridColor);
    pen.setWidthF(0.25);

    int xoffset = xmax / x_step;

    for(int i=0;i<xmax;i+=xoffset)
    {
        QGraphicsLineItem * item = this->addLine(i,0,i,ymax,pen);
        item->setFlags(QGraphicsItem::ItemStacksBehindParent);
        item->setZValue(-3000);
        fverticalLines->push_back(item);
    }

    int yoffset = ymax / y_step;

    for(int i=0;i<ymax;i+=yoffset)
    {
        QGraphicsLineItem * item = this->addLine(0,i,xmax,i,pen);
        item->setFlags(QGraphicsItem::ItemStacksBehindParent);
        item->setZValue(-3000);
        fverticalLines->push_back(item);
    }

    int offset = yoffset/2;

    gridColor = Qt::magenta;
    gridColor.setAlpha(150);
    pen.setColor(gridColor);
    pen.setWidthF(0.25);

    for(int i=offset;i<(ymax-offset);i+=yoffset)
    {
        QGraphicsLineItem * item = this->addLine(0,i,xmax,i,pen);
        item->setFlags(QGraphicsItem::ItemStacksBehindParent);
        item->setZValue(-3000);
        fverticalLines->push_back(item);
    }
}
где x_max, y_max - фиксированная ширина сцены,
x_step,y_step - шаг сетки.
Пробовал сначала в drawBackground - но уж очень тормозит при скролле и скалинге.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Август 31, 2011, 16:03 »

Пробовал сначала в drawBackground - но уж очень тормозит при скролле и скалинге.
Странно. Не должно быть тормозов, если правильно делать.
Записан

Qt 5.11/4.8.7 (X11/Win)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #2 : Август 31, 2011, 17:51 »

я там делал как, рисовал один раз в пиксмап, а потом отображал его в drawBackground.
ибо я подозреваю что рисовать динамически сетку будет накалдно при частых операциях на сцене
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #3 : Август 31, 2011, 17:52 »

да и при скалинге идут искажения
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Август 31, 2011, 17:57 »

я там делал как, рисовал один раз в пиксмап, а потом отображал его в drawBackground.
Ну дык...
Цитировать
ибо я подозреваю что рисовать динамически сетку будет накалдно при частых операциях на сцене
С чего это? А создавать QGraphicsLineItem's не накладно Непонимающий
В QGraphicsView::drawBackground( QPainter* painter, const QRectF& rect ) рисовать нужно только в границах rect.
Записан

Qt 5.11/4.8.7 (X11/Win)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #5 : Сентябрь 01, 2011, 08:54 »

я знаю что в границах rect, но во первых как корректно рисовать сетку в этой границе?
во вторых при перемещении элемента возникают артефакты, как будто сетка немного сдвигается в месте перемещения. поэтому перешёл на вышеописанный способ.
Записан
_OLEGator_
Гость
« Ответ #6 : Сентябрь 01, 2011, 10:46 »

артефакты видимо из-за минимальности перерисовки, флаг QGraphicsView::MinimalViewportUpdate.
попробуйте поэкспериментировать, либо сразу указать полное обновление вьювера:
Код
C++ (Qt)
QGraphicsView::setViewportUpdateMode(QGraphicsView::FullViewportUpdate)
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #7 : Сентябрь 01, 2011, 21:20 »

по умолчанию стоит smartupdate, так как на fullupdate наблюдаются нешуточные тормоза (да и объектов много, плюс размер сцены 3840*1080 - на два 32 монитора). поэтому остановился на своем "велосипеде" - по крайней мере не тормозит и скалится нормально. в идеале хотелось бы еще выводить линейки как visio, но думаю пока не стоит на этом заморачивыаться
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #8 : Апрель 12, 2012, 16:50 »

есть еще решения?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Апрель 12, 2012, 16:58 »

есть еще решения?
Тебе же дали ответ здесь.
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.069 секунд. Запросов: 23.