Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: n4ela от Октябрь 04, 2009, 18:27



Название: QPainter, paintEvent как правильно рисовать?
Отправлено: n4ela от Октябрь 04, 2009, 18:27
Задача стоит. отмечать на QWidget точки при клики мыши.
Код:
cpp:
Код
C++ (Qt)
Widget::Widget(QWidget *parent)
   : QWidget(parent), ui(new Ui::Widget)
{
   ui->setupUi(this);
   x = 10;
   y = 10;
}
void Widget::paintEvent( QPaintEvent *event )
{
   QPainter painter( this );
   painter.setPen( QPen( Qt::black, 3 ) );
   painter.drawPoint( QPoint( x, y ) );
}
Widget::~Widget()
{
   delete ui;
}
 
void Widget::mousePressEvent( QMouseEvent *mouseEvent )
{
   if ( mouseEvent->button() == Qt::LeftButton )
   {
       x = mouseEvent->x();
       y = mouseEvent->y();
       update();
   }
}
 
h:
Код
C++ (Qt)
namespace Ui
{
   class Widget;
}
 
class Widget : public QWidget
{
   Q_OBJECT
 
public:
   Widget(QWidget *parent = 0);
   ~Widget();
 
protected:
   void paintEvent( QPaintEvent *event );
   virtual void mousePressEvent( QMouseEvent *mouseEvent );
 
private:
   Ui::Widget *ui;
   int x;
   int y;
};
 
Проблема в том что при клики, предыдущая точка затирается. В гугли нашел что при таком случаи надо рисовать на QImage, сейчас буду читать доку, но есть еще пару вопросов.
И еще если я переопределяю метод как:
Код
C++ (Qt)
void paintEvent( QPaintEvent *event, int x, int y );
 
а в mouseEvent просто ставлю update() то на виджете не рисуется почему?
И последний вопрос, если использовать код который сейчас, то при запуске программы первая точка рисуется сам, по координатам заданным в конструкторе, как сделать так что бы первая точка рисовалась только по клику и по координатам этого клика?
Заранее спасибо.


Название: Re: QPainter, paintEvent как правильно рисовать?
Отправлено: StogovOleg от Октябрь 04, 2009, 19:52
есть вариант - использовать массив или вектор (что удобнее) для запоминания координат точек и в paintEvent в цикле рисовать каждую точку


Название: Re: QPainter, paintEvent как правильно рисовать?
Отправлено: StogovOleg от Октябрь 04, 2009, 19:58
к вопросу о первой точке - предыдущий ответ решит эту проблему
к вопросу о "переопределении" функции - добавляя параметры, создаешь новую функцию (перегружаешь), которая, не смотря на схожее название paintEvent является все-таки другой функцией, которую метод update() не вызывает, поэтому и не рисует


Название: Re: QPainter, paintEvent как правильно рисовать?
Отправлено: n4ela от Октябрь 05, 2009, 00:00
Спасибо большое, все понял.
Добавлено:
А кстати то что компилятор кидает warning параметр ‘event’ не используется, нормально? Имею виду может его где то надо было использовать или отключить подобного рода варнинги?


Название: Re: QPainter, paintEvent как правильно рисовать?
Отправлено: Vexator от Октябрь 05, 2009, 03:01
передай event дальше QWidgetу )


Название: Re: QPainter, paintEvent как правильно рисовать?
Отправлено: Danila_Bagrofff от Октябрь 05, 2009, 07:04
передай event дальше QWidgetу )

И тогда передав событие стандартному обработчику, должен заработать и update, так как событие отловит теперь уже стандартный обработчик.

Передача дальше:
QWidget::event(event);


Название: Re: QPainter, paintEvent как правильно рисовать?
Отправлено: Igors от Октябрь 05, 2009, 09:04
Имею виду может его где то надо было использовать или отключить подобного рода варнинги?
Использовать или нет - по обстановке (не ошибка). Отключать такой warning не очень хорошо, может в др. случае быть полезным. Проще добавить в функцию пустое использование, например

(void) event;


Название: Re: QPainter, paintEvent как правильно рисовать?
Отправлено: pastor от Октябрь 05, 2009, 13:08
Проще добавить в функцию пустое использование, например
(void) event;

Для этого есть макрос Q_UNUSED(...);

Цитировать
Q_UNUSED ( name )
Indicates to the compiler that the parameter with the specified name is not used in the body of a function. This can be used to suppress compiler warnings while allowing functions to be defined with meaningful parameter names in their signatures.


Название: Re: QPainter, paintEvent как правильно рисовать?
Отправлено: IGHOR от Октябрь 07, 2009, 21:16
Вроде так корректнее передавать ивент дальше: event->accept(); а заглушить так event->ignore();


Название: Re: QPainter, paintEvent как правильно рисовать?
Отправлено: Alex Custov от Октябрь 07, 2009, 21:53
Вроде так корректнее передавать ивент дальше: event->accept(); а заглушить так event->ignore();

QWidget сам ничего не рисует, передавать paint event дальше не нужно.


Название: Re: QPainter, paintEvent как правильно рисовать?
Отправлено: Alex Custov от Октябрь 07, 2009, 21:54
Спасибо большое, все понял.
Добавлено:
А кстати то что компилятор кидает warning параметр ‘event’ не используется, нормально? Имею виду может его где то надо было использовать или отключить подобного рода варнинги?

сотри имя переменной "event", или используй Q_UNUSED


Название: Re: QPainter, paintEvent как правильно рисовать?
Отправлено: Vexator от Октябрь 08, 2009, 09:59
а как это повлияет на работу?


Название: Re: QPainter, paintEvent как правильно рисовать?
Отправлено: SABROG от Октябрь 08, 2009, 23:15
а как это повлияет на работу?

Никак. Если переменная объявленная как параметр метода не используется, то msvc'шный компилятор перестанет ругаться. MinGW в этом плане мозг программиста не насилует.