Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Alchazar от Декабрь 03, 2009, 14:21



Название: QPaint как рисовать на QGraphicsView?
Отправлено: Alchazar от Декабрь 03, 2009, 14:21
Я пожалуй начну с самого начала, и расскажу что я хочу сделать. А потом по по пунктам разложу все свои вопросы/проблемы.
Есть список элементов(компьюторы), в базе данных о каждом элементе хранится информация (загрузка ц.п. в опр. момент, использование памяти и т.п.), которую я хочю показать в графике. Количество графиков заранее неизвестно (то есть их придётся создавать во время работы програмы).
А теперь проблема с которой я столкнулся, и уже второй день не могу решить:
Как указать Qpaint, что рисовать надо на QGraphicsView?
Я пробовал сделать так:
Код
C++ (Qt)
void FMain::paintEvent(QPaintEvent * event)
{
       QPainter *painter = new QPainter(graphicsView_cpuTemp);
       painter->setPen(Qt::SolidLine);
       painter->drawLine(10,10,60,10);
}
 
Но в косоли получаю ошибку - QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setPen: Painter not active

Может вместо QGraphicsView лучше использовать другой компонент?

И ещё вопрос на будущее:
Как лучше рисовать график, собрать все данные в список (list?) и потом из списка рисовать график, или есть какой способ получше(правильнее)?


Название: Re: QPaint как рисовать на QGraphicsView?
Отправлено: pastor от Декабрь 03, 2009, 14:51
Как-то так:

Код
C++ (Qt)
void FMain::paintEvent(QPaintEvent * event)
{
       QPainter painter;
       painter.begin(graphicsView_cpuTemp->viewport());
       painter.setPen(Qt::SolidLine);
       painter.drawLine(10,10,60,10);
       painter.end();
}


Название: Re: QPaint как рисовать на QGraphicsView?
Отправлено: Alchazar от Декабрь 03, 2009, 14:59
viewport() не помог, та же самая ошибка - Paint device returned engine == 0, type: 1
QPainter::setPen: Painter not active


Название: Re: QPaint как рисовать на QGraphicsView?
Отправлено: pastor от Декабрь 03, 2009, 15:31
Вопрос тогда другой, зачем это нужно рисовать на QGraphicsView?

Используй QGraphicsView +  QGraphicsScene + QGraphicsItemХ и производи отрисовку непосредственно в QGraphicsItemХ


Название: Re: QPaint как рисовать на QGraphicsView?
Отправлено: Alchazar от Декабрь 03, 2009, 15:39
На данный момент мне нету разницы, QGraphicsView это будет или нет, главное чтобы было удобно. Попробую почитать о QGraphicsScene + QGraphicsItemХ.


Название: Re: QPaint как рисовать на QGraphicsView?
Отправлено: pastor от Декабрь 03, 2009, 15:48
Попробуй наследоваться от QGraphicsView и переопределить paintEvent. Он будет выглядеть так:

Код
C++ (Qt)
void CustomGraphicsView::paintEvent(QPaintEvent * event)
{
       QPainter painter;
       painter.begin(viewport());
       painter.setPen(Qt::SolidLine);
       painter.drawLine(10,10,60,10);
       painter.end();
}

Но я недумаю что это хорошая идея.

ЗЫ: если QGraphicsView не принципиально в использовании, возьми QScrollArea, переопредели paintEvent как я показал выше и рисуй


Название: Re: QPaint как рисовать на QGraphicsView?
Отправлено: Alchazar от Декабрь 03, 2009, 16:37
Что-то у меня ничего не получается  ???
Можно подробнее, как и что делать?


Название: Re: QPaint как рисовать на QGraphicsView?
Отправлено: Alchazar от Декабрь 03, 2009, 17:24
что-то я тут намудрил...
 вроде всё правильно, только почему-то QGraphicsView вылазит в новом окне(

Код
C++ (Qt)
QScrollArea *scrollArea;
       scrollArea = new QScrollArea(groupBox_3);
       scrollArea->setObjectName(QString::fromUtf8("scrollArea"));
       scrollArea->setGeometry(QRect(130, 10, 301, 80));
       scrollArea->setWidgetResizable(true);
       scrollArea->show();
 
       QGraphicsScene *scene;
       scene = new QGraphicsScene(scrollArea);
       scene->addLine(10,10,50,20);
 
       QGraphicsView *view;
       view = new QGraphicsView(scene);
       view->show();


Название: Re: QPaint как рисовать на QGraphicsView?
Отправлено: Rcus от Декабрь 03, 2009, 17:35
Странно? Нет - работает как и положено
Цитировать
QGraphicsView::QGraphicsView ( QGraphicsScene * scene, QWidget * parent = 0 )

Constructs a QGraphicsView and sets the visualized scene to scene. parent is passed to QWidget's constructor.


Название: Re: QPaint как рисовать на QGraphicsView?
Отправлено: Alchazar от Декабрь 03, 2009, 17:55
Спасибо за подсказку), исправил - view = new QGraphicsView(scene, scrollArea);
Вот только у меня вопрос, правильно ли я делаю? Может можно сделать тоже самое только лучше?


Название: Re: QPaint как рисовать на QGraphicsView?
Отправлено: Rcus от Декабрь 03, 2009, 18:09
Это зависит от... но вообще нужно иметь достаточно веские причины для того чтобы размещать QGraphicsView (потомок QAbstractScrollArea) в QScrollArea.
А еще если вам нужно рисовать графики возьмите лучше Qwt - библиотека качественная, гибкая и достаточно взрослая.


Название: Re: QPaint как рисовать на QGraphicsView?
Отправлено: Alchazar от Декабрь 04, 2009, 09:28
Qwt смотрел, вот только мне не получилось его установить.


Название: Re: QPaint как рисовать на QGraphicsView?
Отправлено: OS2 от Январь 12, 2010, 18:05
2 Alchazar
http://www.prog.org.ru/topic_11760_0.html