Название: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте Отправлено: AAXEE от Ноября 29, 2008, 21:45 С рисованием с помощью QGraphicsItem я разобрался.
Пытался рисовать QPainterом. В paintEvent получается рисовать примитивы(линии, квадраты, эллипсы ), но дальше не понимаю. Вот вопрос, ответ на который должен прояснить для меня ситуацию. Как сделать два слота, так чтобы при срабатывании первого на моем виджете рисовался круг, а при срабатывании второго квадрат? И соответственно каким должен быть paintEvent Все непонимание, в сущности, заключается в том, что непонятно когда вызывается paintEvent. И он ведь один(метод для рисования чего-то)! А если надо разные вещи рисовать? Помогите пожалуйста, столько времени уже ковыряюсь, и все без толку. Я в отчаянии. Спасибо! Название: Re: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте Отправлено: ритт от Ноября 29, 2008, 22:19 попробуй вот так:
Код: class MyWidget : public QWidget код вбивал прямо в браузере - не исключены баги :) Название: Re: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте Отправлено: AAXEE от Ноября 29, 2008, 22:41 Большое спасибо!
В целом код понятен. Возникло несколько небольших вопросов, но, думаю, я сам на них ответы найду. Сегодня проверять-компилировать уже не смогу, ибо спать... Завтра отпишусь. PS: Я правильно понимаю, что это такой стандартный способ рисования с QPainter, когда необходима реакция на действия пользователя? И да, еще раз спасибо! Я прям рад! Название: Re: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте Отправлено: ритт от Ноября 30, 2008, 00:31 > Я правильно понимаю, что это такой стандартный способ рисования с QPainter, когда необходима реакция на действия пользователя?
по-моему, такого понятия ("стандартный способ") для данного случая вообще не существует. канва - это как осколок линейного программирования, чудом доживший до наших дней - пора бы уже забыть про него... есть механизм, отвечающие за рисование (paintengine), механизм, отвечающий за взаимодействие с пользователем и средой (events и т.д.) - и абсолютно правильно, что Тролли не стали смешивать столь разные механизмы в какое-то монструозное поделие с целью облегчить понимание делфинистам/флешерам. не для того кутэ было задумано. удачного изучения. ветку переношу в "вопросы нвичков" Название: Re: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте Отправлено: AAXEE от Ноября 30, 2008, 17:30 Код работает.
Но все равно мне непонятно зачем такие извращения. Объекты были придуманы для облегчения труда. В данном случае только усложнение. Объекты ради объектов, а не ради программиста. Буду считать, что я еще не осознал эту философию, и писать дальше - ничего не поделаешь. В любом случае благодарен. Название: Re: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте Отправлено: Rcus от Ноября 30, 2008, 18:03 Классы это инструмент борьбы со сложностью. Возможно вы не видите сложности в создании кроссплатформенного интерфейса (не только графического), но все же Qt работает под 3 совершенно разными семействами операционных систем. В данном случае QPainter обеспечивает высокоуровневую абстракцию над конкретными реализациями систем вывода графики (судя по assistant есть по крайней мере 13 реализаций QPaintEngine, и можно добавлять свои)
Название: Re: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте Отправлено: AAXEE от Ноября 30, 2008, 18:15 Хорошо, понятно.
А скажите, принципиально возможно самому написать билдеровский Canvas с помощью QPainter? И использовать так как более понятно. Название: Re: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте Отправлено: ритт от Ноября 30, 2008, 23:03 если очень хочется, то можно.
вот только нафига? спасибо никто всё-равно не скажет, да и сам со временем увидишь, что это не нужно... кстати, фактически канва делфи - это битмап (пиксмап в наше случае) определённого размера...откуда вытекает необходимость в двойной буфферизации и множество неудобств, связанных с рисованием на этом пиксмапе. в итоге же этот пикмап всё-равно придётся отрисовывать через пеинтнджине кут - купинтер. Название: Re: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте Отправлено: panAlexey от Декабря 01, 2008, 13:20 Хорошо, понятно. Лучшим выходом будет постичь логику программирования GUI в целом. А скажите, принципиально возможно самому написать билдеровский Canvas с помощью QPainter? И использовать так как более понятно. А логика в том, что GUI-программирование построено на событийной модели. Windows/GM(KDE например) посылает сигналы, например: прорисуй окно: и ты должен рисовать, окно меняет размер: ты реагируешь; мыша сработала: ты реагируешь. Логика отрисовки требует, что-бы ты подготовил данные в удобной для отрисовки до сигнала paintEvent. Как ты будешь их готовить, твое дело, хоть в канвасе, хоть в пиксмепе, хоть еще как-то.. Название: Re: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте Отправлено: panAlexey от Декабря 01, 2008, 13:24 ветку переношу в "вопросы новичков" Зачем? Осознание новых технологий - это циклический процесс в жизни любого специалиста. Тут нет четких градаций: новичек-спец-гуру. Это число субъективная оценка, она зависит только от уровня оценщика. пожалуйста не надо так делать. Кроме психологического дискомфорта такие действия ничего не дадут. Название: Re: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте Отправлено: Volder от Января 27, 2009, 03:23 А скажите пожалуста как, к примеру, нам сохронить место положения круга. Ми нарисовали один круг а потом ищо оди
что нужни сделать штоби ми имели 2 или больше кругов Название: Re: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте Отправлено: BRE от Января 27, 2009, 08:53 Можно пойти несколькими путями, например:
* Все функции рисования рисуют во внутренний буфер, paintEvent только рисует этот буфер на виджет. В этом случае по буферу невозможно узнать, какой объект где нарисован, переместить его и т.д. (без дополнительных телодвижений). * Функции рисования не рисуют объекты, а добовляют их в коллекцию, а функция paintEvent берет и из коллекции и рисует на виджет. В этом случае можно определить сколько объектов на сцене, модифицировать их как угодно. (получаем примитивный QGraphicsScene+QGraphicsView). Название: Re: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте Отправлено: kpx13 от Апреля 15, 2010, 17:37 А как сделать этот буфер???
Название: Re: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте Отправлено: BRE от Апреля 15, 2010, 17:45 А как сделать этот буфер??? Этим буфером может быть QPixmap/QImage.Название: Re: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте Отправлено: kpx13 от Апреля 15, 2010, 17:49 Но у меня не получается (
Напишите, пожалуйста, как загружать и выгружать изображение из QPixmap и обратно! И где по рисованию инфу найти? Я ничего дельного не нашла пока( Хотя у меня 3 книжки по Qt. И что за методы такие у QPainter save и restore? И чем отличаются QPixmap и QImage? Название: Re: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте Отправлено: BRE от Апреля 15, 2010, 17:58 Но у меня не получается ( Все есть в assistant и примерах.Напишите, пожалуйста, как загружать и выгружать изображение из QPixmap и обратно! И где по рисованию инфу найти? Я ничего дельного не нашла пока( Хотя у меня 3 книжки по Qt. Код
Название: Re: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте Отправлено: kpx13 от Апреля 15, 2010, 18:50 QPixmap buf;
void GraphWindow::paintEvent(QPaintEvent *) { QPainter p; p.begin(&buf); p.drawEllipse(0,0,100,300); p.end(); p.begin(this); p.drawPixmap(0,0,buf); p.end(); } Почему это ничего не рисует?((( Ошибка QPainter::end: Painter not active, aborted QPainter::begin: Paint device returned engine == 0, type: 2 Название: Re: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте Отправлено: BRE от Апреля 15, 2010, 18:59 Обрати внимание какой конструктор используется:
Код
Название: Re: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте Отправлено: kpx13 от Апреля 15, 2010, 19:45 Спасибо большое, я разобралась! :)
|