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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QPainter - концептуальный вопрос.  (Прочитано 6025 раз)
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 должно быть достаточно просто получить доступ к изменениям и отрисовать их. зачем тратить  ресурсы и время на уничтожение и создание немаленького объекта при малейших изменениях?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Август 24, 2011, 10:35 »

зачем тратить  ресурсы и время на уничтожение и создание немаленького объекта при малейших изменениях?
sizeof( QPainter ) == 4
Просто огромный объект. Смеющийся

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

Also:
Код
C++ (Qt)
void MyWidget::paintEvent( QPaintEvent * )
{
    QPainter m_pPainter( this );
    m_pPainter.drawLine( QPoint( 0, 0), QPoint( 200, 200) );
}
чтобы delete ненароком не потерять.
« Последнее редактирование: Август 24, 2011, 10:44 от LisandreL » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Август 24, 2011, 10:38 »

зачем тратить  ресурсы и время на уничтожение и создание немаленького объекта при малейших изменениях?
sizeof( QPainter ) == 4
Просто огромный объект. Смеющийся
Угу. Причем его лучше создавать на стеке.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
once_again_abc
Гость
« Ответ #3 : Август 24, 2011, 10:42 »

зачем тратить  ресурсы и время на уничтожение и создание немаленького объекта при малейших изменениях?
sizeof( QPainter ) == 4
Просто огромный объект. Смеющийся

тогда еще более непонятно зачем каждый раз делать new/delete в paintEvent?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #4 : Август 24, 2011, 10:48 »

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

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

вопрос именно в создании объекта, а не в том, каким образом я его создаю - на стеке или динамически.
не могли бы вы объяснить почему приходится каждый раз зодавать объект "рисовальщик"? в чем суть идея? какой в этом смысл? почему нельзя один раз это сделать в конструкторе виджета?
Записан
once_again_abc
Гость
« Ответ #6 : Август 24, 2011, 10:55 »

конечно исходники хорошее лекарство =)
но может быть кто-то уже разобрался в этом вопросе и сможет объяснить вкратце?
у меня сейчас нет возможности разбирать исходники, а понять концепцию рисовальщика хочется.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #7 : Август 24, 2011, 11:08 »

но может быть кто-то уже разобрался в этом вопросе и сможет объяснить вкратце?
в конструкторе и деструкторе вероятно происходит некоторая инициализация, которую вне paintEvent'а сделать нельзя (как и прочую отрисовку).
Записан
once_again_abc
Гость
« Ответ #8 : Август 24, 2011, 11:15 »

спасибо, остановлюсь пока на этом знании =)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Август 24, 2011, 11:24 »

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

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

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

Не забывайте использовать теги для выделения кода в Ваших постах - читается трудно
Записан
brankovic
Гость
« Ответ #10 : Август 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 ();
}
 
« Последнее редактирование: Август 24, 2011, 11:48 от brankovic » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #11 : Август 24, 2011, 12:50 »

>>а не в том, каким образом я его создаю - на стеке или динамически.
вообще это приниципиальная разница. При создании объекта динамически, требуется больше времени на создание объекта, в отличие от созданиии его же на стеке.
Записан

Юра.
SASA
Гость
« Ответ #12 : Август 24, 2011, 14:47 »

Как говорил Макконнелл "Снижайте сложность" Подмигивающий Чем меньше область видимости у переменных - тем меньше сложность. В данном случае затраты на это минимальны.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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