Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: AAXEE от Ноябрь 29, 2008, 21:45



Название: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте
Отправлено: AAXEE от Ноябрь 29, 2008, 21:45
С рисованием с помощью QGraphicsItem я разобрался.
Пытался рисовать QPainterом.
В paintEvent получается рисовать примитивы(линии, квадраты, эллипсы ), но дальше не понимаю.
Вот вопрос, ответ на который должен прояснить для меня ситуацию.

Как сделать два слота, так чтобы при срабатывании первого на моем виджете рисовался круг, а при срабатывании второго квадрат? И соответственно каким должен быть paintEvent

Все непонимание, в сущности, заключается в том, что непонятно когда вызывается paintEvent.
И он ведь один(метод для рисования чего-то)! А если надо разные вещи рисовать?
Помогите пожалуйста, столько времени уже ковыряюсь, и все без толку. Я в отчаянии.

Спасибо!


Название: Re: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте
Отправлено: ритт от Ноябрь 29, 2008, 22:19
попробуй вот так:
Код:
class MyWidget : public QWidget
{
Q_OBJECT

public:
MyWidget(QWidget* parent = 0) : QWidget(parent),
m_drawRect(false),
m_drawCircle(false)
{
}

public slots:
void drawRect()
{
m_drawRect = true;
update();
}
void drawCircle()
{
m_drawCircle = true;
update();
}

protected:
void paintEvent(QPaintEvent* event)
{
Q_UNUSED(event);

QPainter painter(this);
painter.setPen(Qt::darkGray);
painter.setBrush(Qt::darkGray);

if(m_drawRect)
painter.drawEllipse(rect());
if(m_drawCircle)
painter.drawEllipse(rect());
}

private:
bool m_drawRect;
bool m_drawCircle;
};
если этот код понятен, особых проблем впредь быть не должно...

код вбивал прямо в браузере - не исключены баги :)


Название: 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
Хорошо, понятно.
А скажите, принципиально возможно самому написать билдеровский Canvas с помощью QPainter? И использовать так как более понятно.
Лучшим выходом будет постичь логику программирования GUI в целом.
А логика в том, что 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
Но у меня не получается (
Напишите, пожалуйста, как загружать и выгружать изображение из QPixmap и обратно!
И где по рисованию инфу найти? Я ничего дельного не нашла пока( Хотя у меня 3 книжки по Qt.
Все есть в assistant и примерах.
Код
C++ (Qt)
QPixmap buf( 200, 200 );
 
QPainter p( &buf );
p.setPen( Qt::green );
p.setFont( QFont("Arial", 30) );
p.drawText( 10, 30, "Text" );
 


Название: 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
Обрати внимание какой конструктор используется:
Код
C++ (Qt)
QPixmap buf( 200, 200 );
 


Название: Re: У меня глубокое непонимание принципов работы с QPainter и QPaintEvent. Спасайте
Отправлено: kpx13 от Апрель 15, 2010, 19:45
Спасибо большое, я разобралась! :)