QGraphicsView[Photoshop]

 
0
 
C++
ava
Sahab | 15.04.2013, 02:42
Всем привет.
Есть задача, необходимо реализовать упрощенный "фотошоп" на Qt.
Был выбран QGraphicsView из-за лучшей производительности в сравнении с QWidget::paintEvent.
Но возникли некоторый вопросы в плане реализации.
Например, как реализовать Ластик("Eraser") в условиях Ubdo/Redo и слоев.
Может кто сталкивался с подобными вопросами.

Спасибо.
Comments (6)
ava
Amp | 15.04.2013, 12:53 #
QGraphicsView - это ж сценграф, вернее класс для визуализации сцены из QGraphicsScene. Иерархическая структура рендер-примитивов, которая подается на отрисовку, где ты не имеешь доступа к массиву пикселей. Это подошло бы для простого векторного редактора, но не для редактора растровой графики.
ava
Sahab | 15.04.2013, 13:14 #
Другие варианты?
ava
Amp | 15.04.2013, 14:23 #
QWidget с переопределением paintEvent и хранением изображения в QImage smile Слои тоже в QImage с последующей композицией при выводе. Как-то так:



class Canvas : public QWidget
{
private:
    QImage *image;

public:
    paintEvent(QPaintEvent *e)
    {
         QPainter painter(this);
         painter->drawImage(..., *image);
    }

    mouseXXXEvent(QMouseEvent *e)
    {
         QPainter painter(image);
         ....
    }
}



Посмотри например на этот маленький редактор https://github.com/Gr1N/EasyPaint
ava
Sahab | 15.04.2013, 14:47 #
Как рисовать на виджете, я в курсе. Только при эффектах того же кропа или ластика все будет дико лагать.
ava
math64 | 15.04.2013, 15:02 #
Почему же? Будет отрисовываться то, что есть в QImage.
Для отката можно использовать QList<QImage> или другой контейнер:

class Canvas : public QWidget
{
private:
    QList<QImage> mImages;
    int mCurrentImage;
public:
    paintEvent(QPaintEvent *e)
    {
         QPainter painter(this);
         painter->drawImage(..., mImages[mCurrentImage]);
    }
}

Для экономии памяти можно хранить разницу между соседними изображениями.
ava
kamre | 17.04.2013, 16:05 #
Цитата (Sahab @  15.4.2013,  01:42 findReferencedText)
Был выбран QGraphicsView из-за лучшей производительности в сравнении с QWidget::paintEvent

Откуда там лучшая производительность в QGraphicsView?
Когда переопределяешь painEvent, то производительность будет такая как напишешь. В QGraphicsView точно также переопределен paintEvent, а для конкретной задачи можно сделать гораздо быстрее.
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  kamre   Amp   Sahab   math64
advanced
Submit