crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QPainter не хочет рисовать точки с шириной пера более 1
Andrewshkovskii
  опции профиля:
сообщение 9.4.2010, 15:08
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

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




Репутация:   1  


Раскрывающийся текст
bool symbolInput::eventFilter(QObject *o, QEvent *e)
{
    QMouseEvent * me = static_cast<QMouseEvent*> (e);
     if ( o == ui->inputFiled )
    {
         if (me->type() == QEvent::MouseButtonPress)
         {
             if(me->button() == Qt::LeftButton)
                {
                    painter.begin(picture_);
                    painter.setRenderHint(QPainter::Antialiasing,true);
                    pen.setColor(Qt::black);
                    painter.setPen(pen);
                    painter.drawPoint(me->pos());
                    painter.end();
                    lastpoint=me->pos();
                    ui->inputFiled->setPixmap(*picture_);
                    return true;
                }
              else
                if(me->button() == Qt::RightButton )
                {
                   painter.begin(picture_);
                   painter.setRenderHint(QPainter::Antialiasing,true);
                   pen.setColor(Qt::white);
                   painter.setPen(pen);
                   painter.drawPoint(me->pos());
                   painter.end();
                   lastpoint=me->pos();
                   ui->inputFiled->setPixmap(*picture_);
                   return true;
                }
         }
         if(me->type() == QEvent::MouseMove && me->buttons() == Qt::LeftButton)
         {
             painter.begin(picture_);
             painter.setRenderHint(QPainter::Antialiasing,true);
             pen.setColor(Qt::black);
             painter.setPen(pen);
             painter.drawLine(lastpoint,me->pos());
             painter.end();
             lastpoint=me->pos();
             ui->inputFiled->setPixmap(*picture_);
             return true;
         }
          else
               if(me->type() == QEvent::MouseMove && me->buttons() == Qt::RightButton)
                {
              painter.begin(picture_);
              painter.setRenderHint(QPainter::Antialiasing,true);
              pen.setColor(Qt::white);
              painter.setPen(pen);
              painter.drawLine(lastpoint,me->pos());
              painter.end();
              lastpoint=me->pos();
              ui->inputFiled->setPixmap(*picture_);
              return true;
                }
    }
     return QWidget::eventFilter(o,e);
}


    pen.setColor(Qt::black);
    pen.setCapStyle(Qt::RoundCap);
    pen.setBrush(Qt::SolidPattern);
    pen.setStyle(Qt::SolidLine);
    pen.setJoinStyle(Qt::RoundJoin);


Код выше, суть такая : на лейбле стоит эвент фильтр, он обрабатывает события нажатия/перемешения мышки, и соотвественно :
На левый клик рисует точку черную , на правый белую.
На левый клик и перетаскивание рисует линию черную, на правый белую.
Так вот, если установить статично(в коде) , или же через spinbox редактор толщины линии, и менять её, то при толщине 1 - все Ок, при большей - не рисует точки, только линии.
С чем это может быть связано?
Причина редактирования: поправил заголовок *ручка*->*перо*
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 12.4.2010, 11:26
Сообщение #2


Старейший участник
****

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

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




Репутация:   7  


Непонял вот это:
if (me->type() == QEvent::MouseButtonPress)

......
painter.drawPoint(me->pos());

?

me это что?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 12.4.2010, 11:41
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

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




Репутация:   1  


QMouseEvent * me = static_cast<QMouseEvent*> (e);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 12.4.2010, 11:49
Сообщение #4


Старейший участник
****

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

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




Репутация:   7  


Повторюсь...

Цитата
const QPoint & QMouseEvent::pos () const
Returns the position of the mouse cursor, relative to the widget that received the event.

If you move the widget as a result of the mouse event, use the global position returned by globalPos() to avoid a shaking motion.

See also x(), y(), and globalPos().


painter.drawPoint(me->pos());

Это так и задумано?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 12.4.2010, 12:11
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

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




Репутация:   1  


Да, так и задумано.У меня стоит фильтр на этом виджете, который обрабатывает собития мышки, и координата pos() будет относительно этого виджета(там лейбл и в нем пикспам). globalPos() это будет относительно координат винды позиция , разве нет?И я не передвигаю виджет, я полчаю координату нажатия мышки, относительно виджета, на котором стоит фильтр.

Сообщение отредактировал Andrewshkovskii - 12.4.2010, 12:11
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 12.4.2010, 12:41
Сообщение #6


Старейший участник
****

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

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




Репутация:   7  


хм... а как именно толщина линии задается?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_Andrewshkovskii_*_*
сообщение 12.4.2010, 13:59
Сообщение #7





Гости








    


Толщина линии задается через самописный слот , который вызывается сигналом от слайдера/спинбокса valueChanged(int), в слоте просто ставиться drawPen.seetWidth(width)..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 12.4.2010, 14:51
Сообщение #8


Старейший участник
****

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

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




Репутация:   7  


Имхо быстрее всего будет проставить брэйкпоинты в нужных местах и продебажить. Сразу станет понятно какой код отрабатывает, какой реально параметр width приходит и пр.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 12.4.2010, 16:03
Сообщение #9


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

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




Репутация:   1  


Да проблема в том, что при изменении ширины пера, точки- не рисуются, а линии - да, вот что меня удивило.сейчас пофикшено путем изменения координаты ивента на +1.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.4.2010, 16:04
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


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

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


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




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