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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QPaint как рисовать на QGraphicsView?  (Прочитано 15230 раз)
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?) и потом из списка рисовать график, или есть какой способ получше(правильнее)?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Декабрь 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();
}
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Alchazar
Гость
« Ответ #2 : Декабрь 03, 2009, 14:59 »

viewport() не помог, та же самая ошибка - Paint device returned engine == 0, type: 1
QPainter::setPen: Painter not active
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Декабрь 03, 2009, 15:31 »

Вопрос тогда другой, зачем это нужно рисовать на QGraphicsView?

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Alchazar
Гость
« Ответ #4 : Декабрь 03, 2009, 15:39 »

На данный момент мне нету разницы, QGraphicsView это будет или нет, главное чтобы было удобно. Попробую почитать о QGraphicsScene + QGraphicsItemХ.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Декабрь 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 как я показал выше и рисуй
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Alchazar
Гость
« Ответ #6 : Декабрь 03, 2009, 16:37 »

Что-то у меня ничего не получается  Непонимающий
Можно подробнее, как и что делать?
Записан
Alchazar
Гость
« Ответ #7 : Декабрь 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();
Записан
Rcus
Гость
« Ответ #8 : Декабрь 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.
Записан
Alchazar
Гость
« Ответ #9 : Декабрь 03, 2009, 17:55 »

Спасибо за подсказку), исправил - view = new QGraphicsView(scene, scrollArea);
Вот только у меня вопрос, правильно ли я делаю? Может можно сделать тоже самое только лучше?
Записан
Rcus
Гость
« Ответ #10 : Декабрь 03, 2009, 18:09 »

Это зависит от... но вообще нужно иметь достаточно веские причины для того чтобы размещать QGraphicsView (потомок QAbstractScrollArea) в QScrollArea.
А еще если вам нужно рисовать графики возьмите лучше Qwt - библиотека качественная, гибкая и достаточно взрослая.
« Последнее редактирование: Декабрь 03, 2009, 18:12 от Rcus » Записан
Alchazar
Гость
« Ответ #11 : Декабрь 04, 2009, 09:28 »

Qwt смотрел, вот только мне не получилось его установить.
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #12 : Январь 12, 2010, 18:05 »

2 Alchazar
http://www.prog.org.ru/topic_11760_0.html
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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