crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Отрисовка линий по нажатию кнопки мыши, Измерение растояний
myr
  опции профиля:
сообщение 29.9.2009, 14:50
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 37
Регистрация: 4.9.2009
Из: С-Пб
Пользователь №: 1052

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здраствуйте. Посоветуйте. Ничего не знаю но сделать надо.
Выделить область окна по нажатию кнопки мышки. Мышкой щелкнули - потянулась линия, второй раз одна сохранилась вторая от нее началась, как измерение маршрута в топ плане.
после полного выделения все стереть.

Надо при обработке mouse event, вызывать paint? как сохранить преведущую линию между отрисовками? как все стереть потом?

Или отошлите на пример.
Спасибо.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 29.9.2009, 15:02
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


мало что понял из вопроса.

П.С.
ключи для поиска в ассисетенте и на форуме
paintEvent
qpainter
mouseEvent
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
myr
  опции профиля:
сообщение 29.9.2009, 15:13
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 37
Регистрация: 4.9.2009
Из: С-Пб
Пользователь №: 1052

Спасибо сказали: 0 раз(а)




Репутация:   0  


Есть изображение.
Щелкнули мышкой. При перемешении курсора и нажатой кнопке мыши тянется линия. Одним концом линия закреплена на месте нажатия кнопки мыши. Перемещаетьс туда, куда двигаеться курсор.
Не понимаю как ее отрисовывать и стирать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 29.9.2009, 15:52
Сообщение #4


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


переопределяешь paintEvent в классе наследнике от QPaintDevice(QWidget, QImage, QPixmap etc.) в нем же заводишь член класса -- координата последнего нажатия мыши(может список координат нажатий при рисовании ломанной линии) в переопределенном paintEvent рисуешь линию от сохранненой координаты до текущего положения мыши, в событии движения мыши mouseMove вызываешь update().
основная идея такая.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
myr
  опции профиля:
сообщение 29.9.2009, 20:59
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 37
Регистрация: 4.9.2009
Из: С-Пб
Пользователь №: 1052

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо. Понятно.
Как удалить нарисованную линию? После отрисовки всего полинома?. Отрисовали пользователь посмотрел - стал рисовать нову старая затерлась.
Или сама пропадет?
Есть какие-то механизмы?

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 30.9.2009, 8:03
Сообщение #6


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


ну как сказать.
если хранить координаты концов линий к примеру в векторе и перерисовывать все линии в paintEvent, то удалив из вектора координату при следующей перерисовке не нужной линии не будет.(если удалить все то ничего не будет)

читай про рисование в Qt, обнаружишь что перед вызовом paintEvent виджет уже стёрт. т.е. если в нем вызвать paintEvent предка то все линии пропадут.
флагами можно выставлять условия в переопределенном paintEvent рисовать или не рисовать(вызывать отрисовку вектора или просто вызывать paintEvent родительского класса).

Сообщение отредактировал kwisp - 30.9.2009, 8:05
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 30.9.2009, 9:03
Сообщение #7


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


вот тебе кусок кода
разбирайся.
Раскрывающийся текст

#ifndef __MOUSELINE_H__
#define __MOUSELINE_H__
#include <QWidget>
#include <QVector>
#include <QPoint>
#include <QPainter>
#include <QBrush>
#include <QPen>
#include <QPaintEvent>

class MouseLine: public QWidget {
    public:
        MouseLine(QWidget* p = 0): QWidget(p)
        {

        }
    private:
        QVector<QPoint>        m_points;

    protected:
        void paintEvent(QPaintEvent* ev)
        {
            if(m_points.isEmpty()) QWidget::paintEvent(ev);
            else if(m_points.size() > 1){
                QPainter painter(this);
                painter.setPen(Qt::red);
                QVectorIterator<QPoint> iter(m_points);
                QPoint begin,end;
                end  = iter.next();
                while(iter.hasNext()){
                    begin = end;
                    end = iter.next();
                    painter.drawLine(begin,end);
                }
//                painter.drawLines(m_points);
//                painter.drawLines(m_points.data() + 1, m_points.size()/2 - 1);
            }
        }
        void mousePressEvent(QMouseEvent* ev)
        {
            Qt::MouseButton button = ev->button();
            const QPoint& point = ev->pos();
            if(button == Qt::LeftButton) m_points.append(point);
            else if(button == Qt::RightButton) m_points.clear();
            update();
        }
        void mouseMoveEvent(QMouseEvent* ev)
        {
            m_points.last() = ev->pos();
            update();
        }

};


#endif

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
myr
  опции профиля:
сообщение 30.9.2009, 12:58
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 37
Регистрация: 4.9.2009
Из: С-Пб
Пользователь №: 1052

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо. Пробую.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
myr
  опции профиля:
сообщение 30.9.2009, 19:40
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 37
Регистрация: 4.9.2009
Из: С-Пб
Пользователь №: 1052

Спасибо сказали: 0 раз(а)




Репутация:   0  


Алгоритм понятен, получилось.
Проконсультируйте еще пожалуйста.
У меня главное окно программы на нем компоненнт, наследуемый от Scrollview, у компонента есть сигнал после отрисовки.
SignalAfterPaint(QPainter* p, int cx, int cy, int cw, int ch);
По событию мыши главного окна вызываю для Scrollview -repaint() не попадаю в SignalAfterPaint
Если вызываю contextUpdate() все работает, но жутко мигает. В Scrollview у меня графика с мелкими элементами, перерисовывать не желательно.
Возникло 2 вопроса.
- как достучаться до paintEvent компонента, кооторый уже лежит на форме. (Не понимаю. по шагам если можно.)
- как нарисовать поверх? не периресовывая всего изображения в Scrollview


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 30.9.2009, 20:35
Сообщение #10


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(myr @ 30.9.2009, 20:40) *
- как достучаться до paintEvent компонента, кооторый уже лежит на форме. (Не понимаю. по шагам если можно.)
- как нарисовать поверх? не периресовывая всего изображения в Scrollview

есть соответствующие темы на форуме.
сейчас буду вспоминать где они и как называются а ты поищи.

отвечу сразу на первый вопрос сразу
-- никак, только наследовать компонент и переопределять.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 2:08