Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: AAXEE от Октябрь 19, 2008, 09:31



Название: Рисование без QPaintEvent. Возможно?
Отправлено: AAXEE от Октябрь 19, 2008, 09:31
Здравствуйте!
Моя цель из любого места программы(в main, из функции) рисовать на какой-то области.
Единственное, что я нашел -это Q3Canvas- но " It is provided to keep old source code working. We strongly advise against using it in new code."
Вот, что я смог сделать:
Progr1
canvas.h
Код:
#ifndef CANVAS_H
#define CANVAS_H

#include <QWidget>

class Canvas : public QWidget
{
    Q_OBJECT

protected:
    void paintEvent(QPaintEvent *event);
   
};

#endif
canvas.cpp
Код:
#include <QtGui>

#include "canvas.h"

void Canvas::paintEvent(QPaintEvent * /* event */)
{
    QPainter painter(this);
    painter.drawEllipse(80,80,50,50) ;

}
main.cpp
Код:
#include <QApplication>

#include "canvas.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Canvas myCanvas;
    myCanvas.show();
    return app.exec();
}

Такой подход к рисованию указан почти везде, но мне не понятно как это можно удобно использовать. Есть только один paintEvent, а если я хочу сначала круг, а потом квадрат нарисовать?

Идем дальше:
Prog2
main.cpp
Код:
#include <QApplication>
#include <QtGui>
#include <QWidget>

int main( int argc , char *argv[] )
{
   QApplication app( argc , argv ) ;
   
   QWidget myWidget;
   QPainter painter ;
   painter.begin( &myWidget ) ;
   painter.drawEllipse(80,80,50,50) ;
   painter.end() ;
   myWidget.show() ;
   
   return app.exec() ;
}
Все прекрасно компилируется, но при выполнении ничего не рисуется и выводится сообщение
Цитировать
QPainter::begin: Widget painting can only begin as a result of a paintEvent
QPainter::end: Painter not active, aborted

Вопрос:
В последнем коде можно что-то исправить, что бы заработало?  И как это сделать?
Если нет, то как мне реализовать что-то вроде myCanvas->drawEllipse(100,100,50,50) из любого места программы?
Где то читал, что придется создавать наследуемый классс для QPainter. Если это так, то помогите проследить как его нужно построить.

Спасибо за внимание!


Название: Re: Рисование без QPaintEvent. Возможно?
Отправлено: Rcus от Октябрь 19, 2008, 10:31
Если вам надо именно рисовать в определенной области, то можете почитать документацию по The Graphics View Framework


Название: Re: Рисование без QPaintEvent. Возможно?
Отправлено: shadone от Октябрь 19, 2008, 15:08
Другой вариант - в вашем видете ввести "состояние" - нечто что будет говорить ему что именно должно быть нарисовано. Еще один вариант (менее оптимальный в общем случае) - где-то в общем месте хранить QPixmap на котором рисовать откуда вздумается, а в виджете, в paintEvent рисовать этот самый pixmap.


Название: Re: Рисование без QPaintEvent. Возможно?
Отправлено: AAXEE от Октябрь 20, 2008, 15:49
Всем спасибо!
Если вам надо именно рисовать в определенной области, то можете почитать документацию по The Graphics View Framework
Кажется это то что нужно.
Единственное, не понятно зачем нужен QPainter, если есть QGraphicsView и QGraphicsScene.


Название: Re: Рисование без QPaintEvent. Возможно?
Отправлено: panAlexey от Октябрь 20, 2008, 16:39
Единственное, не понятно зачем нужен QPainter, если есть QGraphicsView и QGraphicsScene.
Это один из низкоуровневых классов для рисования. Он очень нужен :)


Название: Re: Рисование без QPaintEvent. Возможно?
Отправлено: AAXEE от Октябрь 20, 2008, 20:27
Но что бы просто рисовать на форме и изменять координаты объектов на рисунке, ведь не стоит заморачиваться с QPainter?


Название: Re: Рисование без QPaintEvent. Возможно?
Отправлено: lex_newton от Ноябрь 06, 2008, 15:42
Когда важна скорость отрисовки - это очень полезно. Вот сейчас, например, мне необходимо написать виджет для быстрой отрисовки графика сигнала(поигрался с QWT, не устроила скорость работы... на 250000 точек уже тормоза) у меня в среднем порядка 25000000 точек на графике будет. вот отобрази их графикс вьювом без особо заметных тормозов :]