Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: merke от Октябрь 26, 2010, 14:28



Название: Рисование на виджете
Отправлено: merke от Октябрь 26, 2010, 14:28
Всем привет!

Прошу не пинать! Только начинаю работать с QPainter. Требуется рисовать на виджете указателем мышки. Т.е. водим мышку рисуется линия, ну так просто для тестирования возможностей.

Создаю класс унаследованный от QWidget.
Переопределяю:
Код:
    virtual void paintEvent(QPaintEvent *event);
    virtual void mouseMoveEvent(QMouseEvent *event);

Далее пишу:

Код:
void myLabel::mouseMoveEvent(QMouseEvent *event)
{
        QPainter painter(this);
        painter.setPen(Qt::blue);
        painter.drawPoint(event->x(),event->y());
}

Также в конструкторе пишу 
Код:
setMouseTracking(true);

Приложение нормально компилится, запускается, но никакого рисования я не замечаю и в консоль приложения пишется при движении мышки:

QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setPen: Painter not active
QPainter::drawPoints: Painter not active
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setPen: Painter not active
QPainter::drawPoints: Painter not active
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setPen: Painter not active
QPainter::drawPoints: Painter not active

Подскажите, в чем проблема?


Название: Re: Рисование на виджете
Отправлено: Пантер от Октябрь 26, 2010, 14:31
Рисовать нужно в paintEvent, а не в mouseMoveEvent.


Название: Re: Рисование на виджете
Отправлено: GreatSnake от Октябрь 26, 2010, 14:34
Вы как инициализили QApplication и как собирали приложение? Ругань какя-то подозрительная.
И по умолчанию рисование позволительно делать только в paintEvent().


Название: Re: Рисование на виджете
Отправлено: merke от Октябрь 26, 2010, 14:40
Что то под конец дня не вкуриваю( И как мне реализовать данную задачу? Что мне нужно сделать?


Название: Re: Рисование на виджете
Отправлено: Пантер от Октябрь 26, 2010, 14:45
Где-то в экамплах что-то такое было, попробуй поискать.


Название: Re: Рисование на виджете
Отправлено: GreatSnake от Октябрь 26, 2010, 14:45
1. Заводишь в своём классе QPolygon points.
2. Накапливаешь координаты в mouseMoveEvent():
    points << QPoint( event->x(),event->y() );
    Там же делаешь update();
3. В paintEvent() отрисовываешь:
    QPainter painter( this );
    painter.setPen(Qt::blue);
    painter.drawPoins( points );
4. И не мешало бы ещё добавить mousePress()/mouseRelease() методы, чтобы рисовать нажатой мышой)


Название: Re: Рисование на виджете
Отправлено: merke от Октябрь 26, 2010, 15:11
Теперь выдается ошибка при компиляции:

call of overloaded 'drawPoints(QPolygon*&)' is ambiguous

в чем теперь проблема?

Вот код:

Код:
void myLabel::paintEvent(QPaintEvent *event)
{
    QPainter paint(this);
    paint.setPen(Qt::blue);
    paint.drawPoints(points);
}

void myLabel::mouseMoveEvent(QMouseEvent *event)
{
         t_positin(event->x(),event->y()); 
         points->append(QPoint(event->x(),event->y()));
         this->update();
}


Название: Re: Рисование на виджете
Отправлено: GreatSnake от Октябрь 26, 2010, 15:15
А накой ляд надо было points делать указателем?
Разименовывай тогда уж.


Название: Re: Рисование на виджете
Отправлено: merke от Октябрь 26, 2010, 15:19
Ой ошибочке) Всё работает, спасибо что помогли разобраться!!!


Название: Re: Рисование на виджете
Отправлено: lega4 от Октябрь 14, 2011, 18:35
Цитировать
1. Заводишь в своём классе QPolygon points.
2. Накапливаешь координаты в mouseMoveEvent():
    points << QPoint( event->x(),event->y() );
    Там же делаешь update();
3. В paintEvent() отрисовываешь:
    QPainter painter( this );
    painter.setPen(Qt::blue);
    painter.drawPoins( points );
А возможен ли более логичный вариант, как в Студии: на обработку onClick по виджету сразу повесить отрисовку? Мне кажется несколько странным выделять лишнюю память, если можно поставить точку (Пусть пример такой - по клику мышкой ставим точки) сразу же...


Название: Re: Рисование на виджете
Отправлено: Авварон от Октябрь 14, 2011, 20:36
не знаю, как там в "студии", но в мфц рисовать также можно только в контексте события рисования


Название: Re: Рисование на виджете
Отправлено: lega4 от Октябрь 14, 2011, 22:34
Не разбирался во всех тонкостях, но в студии легко написать элементарную вещь - рисование по клику мышкой (Пример (http://sites.google.com/site/alexeysidnev/novosti/primeryvizualnyhprogrammnamanagedc)). И мне кажется странным, что такую логичную вещь нельзя сделать в Qt.


Название: Re: Рисование на виджете
Отправлено: GreatSnake от Октябрь 15, 2011, 12:02
Не разбирался во всех тонкостях, но в студии легко написать элементарную вещь - рисование по клику мышкой (Пример (http://sites.google.com/site/alexeysidnev/novosti/primeryvizualnyhprogrammnamanagedc)). И мне кажется странным, что такую логичную вещь нельзя сделать в Qt.
Студия где работает? Правильно, только на винде. Qt - кросс-платформенный тулкит, поэтому есть некие ограничения. Вся отрисовка в Qt делается асинхронно.

Цитировать
А возможен ли более логичный вариант, как в Студии: на обработку onClick по виджету сразу повесить отрисовку? Мне кажется несколько странным выделять лишнюю память, если можно поставить точку
Интересно, а куда именно вы будете ставить точку? Сразу в видео память? В пиксмап? И как вы будете её перерисовывать, когда потребуется прокрутить вьюпорт?


Название: Re: Рисование на виджете
Отправлено: BRE от Октябрь 15, 2011, 12:07
Не разбирался во всех тонкостях, но в студии легко написать элементарную вещь - рисование по клику мышкой (Пример (http://sites.google.com/site/alexeysidnev/novosti/primeryvizualnyhprogrammnamanagedc)). И мне кажется странным, что такую логичную вещь нельзя сделать в Qt.
Тоже самое можно сделать и в Qt. :)
Рисовать в обработчике клика на QPixmap, а в paintEvent рисовать сам pixmap. Так что проблема надумана.