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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Рисование на виджете  (Прочитано 12283 раз)
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

Подскажите, в чем проблема?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Октябрь 26, 2010, 14:31 »

Рисовать нужно в paintEvent, а не в mouseMoveEvent.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Октябрь 26, 2010, 14:34 »

Вы как инициализили QApplication и как собирали приложение? Ругань какя-то подозрительная.
И по умолчанию рисование позволительно делать только в paintEvent().
Записан

Qt 5.11/4.8.7 (X11/Win)
merke
Гость
« Ответ #3 : Октябрь 26, 2010, 14:40 »

Что то под конец дня не вкуриваю( И как мне реализовать данную задачу? Что мне нужно сделать?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Октябрь 26, 2010, 14:45 »

Где-то в экамплах что-то такое было, попробуй поискать.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Октябрь 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() методы, чтобы рисовать нажатой мышой)
« Последнее редактирование: Октябрь 26, 2010, 14:56 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
merke
Гость
« Ответ #6 : Октябрь 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();
}
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Октябрь 26, 2010, 15:15 »

А накой ляд надо было points делать указателем?
Разименовывай тогда уж.
Записан

Qt 5.11/4.8.7 (X11/Win)
merke
Гость
« Ответ #8 : Октябрь 26, 2010, 15:19 »

Ой ошибочке) Всё работает, спасибо что помогли разобраться!!!
Записан
lega4
Гость
« Ответ #9 : Октябрь 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 по виджету сразу повесить отрисовку? Мне кажется несколько странным выделять лишнюю память, если можно поставить точку (Пусть пример такой - по клику мышкой ставим точки) сразу же...
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #10 : Октябрь 14, 2011, 20:36 »

не знаю, как там в "студии", но в мфц рисовать также можно только в контексте события рисования
Записан
lega4
Гость
« Ответ #11 : Октябрь 14, 2011, 22:34 »

Не разбирался во всех тонкостях, но в студии легко написать элементарную вещь - рисование по клику мышкой (Пример). И мне кажется странным, что такую логичную вещь нельзя сделать в Qt.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #12 : Октябрь 15, 2011, 12:02 »

Не разбирался во всех тонкостях, но в студии легко написать элементарную вещь - рисование по клику мышкой (Пример). И мне кажется странным, что такую логичную вещь нельзя сделать в Qt.
Студия где работает? Правильно, только на винде. Qt - кросс-платформенный тулкит, поэтому есть некие ограничения. Вся отрисовка в Qt делается асинхронно.

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

Qt 5.11/4.8.7 (X11/Win)
BRE
Гость
« Ответ #13 : Октябрь 15, 2011, 12:07 »

Не разбирался во всех тонкостях, но в студии легко написать элементарную вещь - рисование по клику мышкой (Пример). И мне кажется странным, что такую логичную вещь нельзя сделать в Qt.
Тоже самое можно сделать и в Qt. Улыбающийся
Рисовать в обработчике клика на QPixmap, а в paintEvent рисовать сам pixmap. Так что проблема надумана.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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