Russian Qt Forum

Qt => Вопросы новичков => Тема начата: once_again_abc от Август 24, 2011, 10:23



Название: QPainter - концептуальный вопрос.
Отправлено: once_again_abc от Август 24, 2011, 10:23
Объясните мне пожалуйста, почему я каждый раз должен убивать и создавать бъект QPainter в paintEvent-е для рисования?
Почему я не могу в конструкторе моего виджета создать один раз этот объект m_pPainter = new QPainter( this ) и радоваться жизни?

почему так не работает:

void MyWidget::MyWidget(): QWidget() {
     m_pPainter = new QPainter( this )
}

void MyWidget::paintEvent( QPaintEvent * pEvent ) {
     m_pPainter->drawLine( QPoint( 0, 0), QPoint( 200, 200) );
}

а так, работает:

void MyWidget::paintEvent( QPaintEvent * pEvent ) {
     m_pPainter = new QPainter( this );
     m_pPainter->drawLine( QPoint( 0, 0), QPoint( 200, 200) );
     delete m_pPainter;
}

this ведь всегда один и тот же. и в конструкторе объект уже определен, а paintEvent просто напросто меняются некоторые свойства объекта. и по логике объекту QPainter должно быть достаточно просто получить доступ к изменениям и отрисовать их. зачем тратить  ресурсы и время на уничтожение и создание немаленького объекта при малейших изменениях?


Название: Re: QPainter - концептуальный вопрос.
Отправлено: LisandreL от Август 24, 2011, 10:35
зачем тратить  ресурсы и время на уничтожение и создание немаленького объекта при малейших изменениях?
sizeof( QPainter ) == 4
Просто огромный объект. ;D

Ну а так на вскидку - в конструкторе и деструкторе вероятно происходит некоторая инициализация, которую вне paintEvent'а сделать нельзя (как и прочую отрисовку). Если интересуют более точные данные - исходники открыты, можете поразбираться.

Also:
Код
C++ (Qt)
void MyWidget::paintEvent( QPaintEvent * )
{
    QPainter m_pPainter( this );
    m_pPainter.drawLine( QPoint( 0, 0), QPoint( 200, 200) );
}
чтобы delete ненароком не потерять.


Название: Re: QPainter - концептуальный вопрос.
Отправлено: Пантер от Август 24, 2011, 10:38
зачем тратить  ресурсы и время на уничтожение и создание немаленького объекта при малейших изменениях?
sizeof( QPainter ) == 4
Просто огромный объект. ;D
Угу. Причем его лучше создавать на стеке.


Название: Re: QPainter - концептуальный вопрос.
Отправлено: once_again_abc от Август 24, 2011, 10:42
зачем тратить  ресурсы и время на уничтожение и создание немаленького объекта при малейших изменениях?
sizeof( QPainter ) == 4
Просто огромный объект. ;D

тогда еще более непонятно зачем каждый раз делать new/delete в paintEvent?


Название: Re: QPainter - концептуальный вопрос.
Отправлено: LisandreL от Август 24, 2011, 10:48
тогда еще более непонятно зачем каждый раз делать new/delete в paintEvent?
Нам тоже непонятно, зачем вы делаете new/delete.


Название: Re: QPainter - концептуальный вопрос.
Отправлено: once_again_abc от Август 24, 2011, 10:52
тогда еще более непонятно зачем каждый раз делать new/delete в paintEvent?
Нам тоже непонятно, зачем вы делаете new/delete.

вопрос именно в создании объекта, а не в том, каким образом я его создаю - на стеке или динамически.
не могли бы вы объяснить почему приходится каждый раз зодавать объект "рисовальщик"? в чем суть идея? какой в этом смысл? почему нельзя один раз это сделать в конструкторе виджета?


Название: Re: QPainter - концептуальный вопрос.
Отправлено: once_again_abc от Август 24, 2011, 10:55
конечно исходники хорошее лекарство =)
но может быть кто-то уже разобрался в этом вопросе и сможет объяснить вкратце?
у меня сейчас нет возможности разбирать исходники, а понять концепцию рисовальщика хочется.


Название: Re: QPainter - концептуальный вопрос.
Отправлено: LisandreL от Август 24, 2011, 11:08
но может быть кто-то уже разобрался в этом вопросе и сможет объяснить вкратце?
в конструкторе и деструкторе вероятно происходит некоторая инициализация, которую вне paintEvent'а сделать нельзя (как и прочую отрисовку).


Название: Re: QPainter - концептуальный вопрос.
Отправлено: once_again_abc от Август 24, 2011, 11:15
спасибо, остановлюсь пока на этом знании =)


Название: Re: QPainter - концептуальный вопрос.
Отправлено: Igors от Август 24, 2011, 11:24
Вы знакомы с механизмом событий (events), который достаточно общий для разных OC. Рисование  происходит внутри (в теле) event'а. Рисование (сессия) должно быть "начато" и "закончено", и любой OC это предполагает. Напр. результаты рисования не обязаны немедленно отображаться на экране, ОС может вытолкнуть буфер позже. Вполне возможно это и обеспечивает деструктор QPainter.

Поэтому текущий контекст рисования (в данном случае QPainter) имеет смысл только в рамках сессии. ОС не будет хранить контекст и все его многочисленные установки "для каждого из рисующих", все сделанное должно быть собрано в один битмап буфер с которым ОС затем разберется

А вообще здесь не очень любят концептуальные вопросы. Рискуете нарваться на "а ты че, такой умный? Читай Ассыстент, там усе напысано"  :)

Не забывайте использовать теги для выделения кода в Ваших постах - читается трудно


Название: Re: QPainter - концептуальный вопрос.
Отправлено: brankovic от Август 24, 2011, 11:44
почему так не работает:

void MyWidget::MyWidget(): QWidget() {
     m_pPainter = new QPainter( this )
}

void MyWidget::paintEvent( QPaintEvent * pEvent ) {
     m_pPainter->drawLine( QPoint( 0, 0), QPoint( 200, 200) );
}


а вы попробуйте так:

Код
C++ (Qt)
void MyWidget::MyWidget ()
{
    m_pPainter = new QPainter ();
}
 
void MyWidget::paintEvent (QPaintEvent * pEvent)
{
    m_pPainter->begin (this);
    m_pPainter->drawLine( QPoint( 0, 0), QPoint( 200, 200) );
    m_pPainter->end ();
}
 


Название: Re: QPainter - концептуальный вопрос.
Отправлено: lit-uriy от Август 24, 2011, 12:50
>>а не в том, каким образом я его создаю - на стеке или динамически.
вообще это приниципиальная разница. При создании объекта динамически, требуется больше времени на создание объекта, в отличие от созданиии его же на стеке.


Название: Re: QPainter - концептуальный вопрос.
Отправлено: SASA от Август 24, 2011, 14:47
Как говорил Макконнелл "Снижайте сложность" ;) Чем меньше область видимости у переменных - тем меньше сложность. В данном случае затраты на это минимальны.