Задать вопрос
threadbrain
@threadbrain

Как нарисовать график функции стандартными средствами Qt?

Мне нужно построить график функции стандартными средствами Qt.
Я решил попробовать нарисовать на QGraphicsView (т.к. нужно ещё считать количество точек, а QPainter рисует на всём окне как я понимаю). Заполнил вектор точками QPointF, создал класс от QGraphicsItem, в функции Paint, попытался на QPainter функцией drawLines нарисовать по тем точкам этот график. Далее добавил этот item на сцену, запустил программу, нажал кнопку "Нарисовать" и она крашнулась. Затем, попробовал просто с помощью scene->addLine соединить точки того самого вектора, в результате, рисуется что-то похожее на кривой треугольник, а должно быть что-то косинусообразное. Я не знаю как ещё это сделать не прибегая к Qwt и QCustomPlot, и вообще можно ли.

Upd.: Переделал немного первый вариант, программа заработала, но выдаёт так же какую-то ересь
8de6f32481.png
  • Вопрос задан
  • 12850 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
EXL
@EXL
Энтузиаст
В книге "Qt 4: Программирование GUI на C++, издание второе дополненное, Жасмин Бланшет, Марк Саммерфилд, 2008" рассматривается простенький пример виджета Plotter, который может быть использован для рисования графиков. Пример хорошо документирован и описан в книге, разобраться вам не составит труда.

456d8560f61840a28b04650b261a7fac.png
Исходный код примера (который подходит как для Qt 4, так и для Qt 5).

Удачи!
Ответ написан
Комментировать
@DancingOnWater
В сове время занимался этим, даже статью на хабре запилил: habrahabr.ru/post/182142 . Можете поизучать https://github.com/DancingOnWater/GraphicsScenePlot
Ответ написан
Комментировать
@torwig
C++/Qt
Можно просто на виджете нарисовать с помощью QPainter (в paintEvent) без всяких QGraphicsView и пр.
Ответ написан
Nipheris
@Nipheris Куратор тега C++
Код в студию. Все можно нарисовать и в paintEvent как вам уже предложил torwig, есть подозрение что проблема в расчетах. На вскидку, чтобы получить адекватную картику, вам надо правильно отмасштабировать результаты вычисления функции в точках и сменить систему координат. Так что проверьте для начала вручную циферки, адекватны или нет. Потом делаете переопределяете в своем классе ВиджетДляГрафика paintEvent, создаете в нем QPainter, и тут же им рисуете, у него огромное количество методов для рисования. Вот простейший пример: doc.qt.io/qt-4.8/qpainter.html#details . Обойдетесь без всяких сцен и интерактивных элементов. Не усложняйте пока не разобрались точно, где в УЖЕ НАПИСАННОМ коде проблема. "Само" не заработает.
P.S. Если чтото крашится, разбирайтесь с этим отдельно, скорее всего у вас проблемы с временем жизни объектов, которыми мы манипулируете (неправильно создаете/удаляете). Специфика плюсов такова, что за этим нужно следить, иначе быстро зароете себя в спагетти из негодного кода.
Ответ написан
Комментировать
RiseOfDeath
@RiseOfDeath
Диванный эксперт.
В Энтерпрайзной версии Qt есть специальная библиотека для графиков. В комьюнити, увы, только сторонние библиотеки или самопал (QPainter либо рисование через opengl).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы