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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QPainter, paintEvent как правильно рисовать?  (Прочитано 23880 раз)
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() то на виджете не рисуется почему?
И последний вопрос, если использовать код который сейчас, то при запуске программы первая точка рисуется сам, по координатам заданным в конструкторе, как сделать так что бы первая точка рисовалась только по клику и по координатам этого клика?
Заранее спасибо.
Записан
StogovOleg
Гость
« Ответ #1 : Октябрь 04, 2009, 19:52 »

есть вариант - использовать массив или вектор (что удобнее) для запоминания координат точек и в paintEvent в цикле рисовать каждую точку
Записан
StogovOleg
Гость
« Ответ #2 : Октябрь 04, 2009, 19:58 »

к вопросу о первой точке - предыдущий ответ решит эту проблему
к вопросу о "переопределении" функции - добавляя параметры, создаешь новую функцию (перегружаешь), которая, не смотря на схожее название paintEvent является все-таки другой функцией, которую метод update() не вызывает, поэтому и не рисует
Записан
n4ela
Гость
« Ответ #3 : Октябрь 05, 2009, 00:00 »

Спасибо большое, все понял.
Добавлено:
А кстати то что компилятор кидает warning параметр ‘event’ не используется, нормально? Имею виду может его где то надо было использовать или отключить подобного рода варнинги?
« Последнее редактирование: Октябрь 05, 2009, 00:18 от n4ela » Записан
Vexator
Гость
« Ответ #4 : Октябрь 05, 2009, 03:01 »

передай event дальше QWidgetу )
Записан
Danila_Bagrofff
Гость
« Ответ #5 : Октябрь 05, 2009, 07:04 »

передай event дальше QWidgetу )

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

Передача дальше:
QWidget::event(event);
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Октябрь 05, 2009, 09:04 »

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

(void) event;
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Октябрь 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.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #8 : Октябрь 07, 2009, 21:16 »

Вроде так корректнее передавать ивент дальше: event->accept(); а заглушить так event->ignore();
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #9 : Октябрь 07, 2009, 21:53 »

Вроде так корректнее передавать ивент дальше: event->accept(); а заглушить так event->ignore();

QWidget сам ничего не рисует, передавать paint event дальше не нужно.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #10 : Октябрь 07, 2009, 21:54 »

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

сотри имя переменной "event", или используй Q_UNUSED
Записан
Vexator
Гость
« Ответ #11 : Октябрь 08, 2009, 09:59 »

а как это повлияет на работу?
Записан
SABROG
Гость
« Ответ #12 : Октябрь 08, 2009, 23:15 »

а как это повлияет на работу?

Никак. Если переменная объявленная как параметр метода не используется, то msvc'шный компилятор перестанет ругаться. MinGW в этом плане мозг программиста не насилует.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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