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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QPainter, paintEvent как правильно рисовать?  (Прочитано 24182 раз)
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.083 секунд. Запросов: 23.