Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: kilanoff от Февраль 11, 2011, 12:48



Название: Рисование без затирания того что уже нарисовано
Отправлено: kilanoff от Февраль 11, 2011, 12:48
Народ, помогите разобраться, использую paintEvent

надо реализовать что-то вроде paintbrush как в винде
т.е. например выбрал я карандаш, и что бы можно было рисовать точки, которые бы оставались на холсте
вот так сделано в Delphi Pascal

object.canvas.drawPoint(x,y) ну типа того

а как в Qt сделать такое, не получается.

помогите пожалуйста


Название: Re: Рисование без затирания того что уже нарисовано
Отправлено: kilanoff от Февраль 11, 2011, 12:52
извиняюсь, забыл дописать, что рисование происходит на виджете
QLabel
может заменить его на другой объект, на котором это лучше сделать?


Название: Re: Рисование без затирания того что уже нарисовано
Отправлено: _govorilka от Февраль 11, 2011, 13:13
Прочитай про класс QPicture. Рисуй на нём, а потом QPicture рисуй на виджете.

Про то как рисовать на виджете написано здесь:
http://www.prog.org.ru/topic_13567_0.html (http://www.prog.org.ru/topic_13567_0.html)


Название: Re: Рисование без затирания того что уже нарисовано
Отправлено: kilanoff от Февраль 12, 2011, 14:10
Спасибо за ответы, да решил проблему:

appp = QLabel widget

Код:
void appp::paintEvent(QPaintEvent * /* event */)
{
    QPainter painter(this);
    painter.drawImage(QPoint(0, 0), *theImage);
}

инициализирую

Код:
void appp::initNewScreenShot(int xx, int yy, int ww, int hh)
{
    theImage = new QImage(ww, hh, QImage::Format_RGB32);
    theImage->fill(qRgb(0, 0, 0));

    QPainter p(theImage);
    p.drawPixmap(0, 0, ww, hh, QPixmap::grabWindow(QApplication::desktop()->winId(), xx, yy, ww, hh) );
    setGeometry(xx, yy, ww, hh);
}

а рисую:

Код:
        QPainter p1( theImage );
        p1.setPen(QPen(Qt::black, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
        p1.setBrush(Qt::yellow);
        p1.drawPoint(endX,endY);
        p1.drawPath(path);
        p1.end();

        update();


Название: Re: Рисование без затирания того что уже нарисовано
Отправлено: _govorilka от Февраль 12, 2011, 18:05
QImage* лучше заменить на QImage, т.к. он использует Implicit Sharing http://doc.qt.nokia.com/4.7-snapshot/implicit-sharing.html (http://doc.qt.nokia.com/4.7-snapshot/implicit-sharing.html)

Замена QImage на QPicture даст экономию в памяти, т.к. ты не будешь выделять еще один буфер в памяти под картинку. Если тебе все же нужен буфер, то здесь лучше подойдёт QPixmap, он оптимизирован для этого.


Название: Re: Рисование без затирания того что уже нарисовано
Отправлено: kilanoff от Февраль 12, 2011, 20:19
QImage* лучше заменить на QImage, т.к. он использует Implicit Sharing http://doc.qt.nokia.com/4.7-snapshot/implicit-sharing.html (http://doc.qt.nokia.com/4.7-snapshot/implicit-sharing.html)

Замена QImage на QPicture даст экономию в памяти,

спасибо! так наверное будет лучше, попробую