Название: 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: Код чтобы 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) ); } а вы попробуйте так: Код
Название: Re: QPainter - концептуальный вопрос. Отправлено: lit-uriy от Август 24, 2011, 12:50 >>а не в том, каким образом я его создаю - на стеке или динамически.
вообще это приниципиальная разница. При создании объекта динамически, требуется больше времени на создание объекта, в отличие от созданиии его же на стеке. Название: Re: QPainter - концептуальный вопрос. Отправлено: SASA от Август 24, 2011, 14:47 Как говорил Макконнелл "Снижайте сложность" ;) Чем меньше область видимости у переменных - тем меньше сложность. В данном случае затраты на это минимальны.
|