Pull to refresh

Comments 13

Извините за оффтоп, но подскажите, может есть возможность постройки 3D графика из набора точек ({x, y, z})? Потому-что меня не устраивает задавать функцию z = f(x, y), а только такой способ я и нашёл в Qwt.
Для 3D-графиков есть библиотека QwtPlot3D, внутри использующая Qwt. Есть контролы для отображения с возможностью вращения фигур. Правда, я с ней работал году в 2007, текущее состояние мне неизвестно.
В наборе примеров, которые поставляются вместе с Qwt, представлены только двумерные графики. Судя по названию, для ваших задач следует использовать QwtPlot3D.

А также, судя по описанию на официальном сайте QCustomPlot, эта библиотека тоже предназначена только для 2D визуализации.

Если в будущем мне придется работать с QwtPlot3D, обязательно напишу соответствующий tutorial.
Скажите, а можно ли выводить график не в окно/виджет, а в произвольно заданный QPainter? Скажем, в файл?
Выводить график в файл в виде набора координат?
Нет, именно рисовать в файл-изображение. Ну то есть передать библиотеке QPainter, созданный для QPixmap, чтобы она отрисовала в нем, а потом уже этот QPixmap сохранить в файл.
Можно создать невидимый виджет (QwtPlot), а затем отрендерить его куда угодно с помощью QWidget::render (см.), как и любой другой QWidget.
Вот вам немного критики по коду.

Хотя нет, много.
1. Вы выбрали плохие названия для функций setPlot, setPlotGrid, setCurveParameters и setToolBar. В Qt принято начинать с set названия сеттеров, которые принимают новое значение свойства с соответствующим именем и устанавливают его. У вас эти функции не имеют аргументов, что вызывает недоумение. Можно было бы, например, назвать их addPlot, addPlotGrid, createCurve, addMyToolbar. Функция setToolBar настолько тривиальна, что лучше удалить ее, при этом уменьшится число строк и увеличится читаемость. Кстати, у вас в форме уже есть ui->mainToolBar, можно использовать ее, а не создавать еще одну.

2. У функции setStatusBar название особенно плохое, потому что функция QMainWindow::setStatusBar уже существует. Вы ее переопределили, и теперь она делает совсем не то, что раньше. Так нельзя делать, это чревато ошибками. Кроме того, реализация setStatusBar совершенно некорректна. В этой функции вы вызываете функцию statusBar(), если в Qt включена поддержка строки состояния. Функция statusBar() добавляет строку состояния, если ее еще нет. Однако во всех остальных местах вы просто вызываете statusBar(), не проверяя наличие поддержки строки состояния. Если убрать функцию setStatusBar и ее вызов, то ничего не изменится. Вообще говоря, поддержка строки состояния обычно в Qt всё-таки есть. Если же вы всё-таки хотите обрабатывать этот случай, то следует обернуть все вызовы statusBar в ifndef. А функцию setStatusBar и ее вызов всё-таки стоит удалить.

3. Вы снова используете setCentralWidget. Ваше право, но тогда нет смысла использовать Designer Form. Удалите форму из проекта, а из остальных файлов — упоминания о сгенерированном ui-классе. Ничего не изменится. Хотя нет, одна вещь изменится: удалится второй пустой тулбар, который вы всё равно не используете (видно на последнем скриншоте).

4. Нет смысла в переменных класса grid, symbol, magnifier, d_panner. Их можно сделать локальными. Некоторые другие переменные тоже можно сделать локальными, если немного перекомпоновать код. Чем локальнее, тем лучше.

5. Непонятно, зачем дублировать данные в pointArray и points и параллельно их менять. Можно убрать pointArray и использовать points вместо него.


В целом код переусложненный и плохо оформленный. Постарайтесь это исправить в следующих статьях. Кстати, исходники лучше выкладывать на github, а не в виде архива. Я бы вам сразу pull request сделал с готовыми правками.
Согласен с комментарием, похожие мысли возникли (особенно 1-3). И еще, смущает упоминание Qt Creator в статье, и вариант «Стандартные средства Qt Creator» — это какие вообще? И что люди которые это выбрали, имели в виду? Qt Creator не имеет никаких «стандартных средств графиков», это ж IDE, блин. Все что в статье написано, можно и в MSVS с плагином Qt делать. Я бы на месте автора акцент с IDE все-таки сместил.

P.S. сам пользуюсь в разработке только QtC и очень его люблю.
mapron, под стандартными средствами Qt Creator я понимаю, например, Graphics View — изначально входит в Qt Creator, т. е. не требует дополнительной установки. Возможно, не совсем верно называть это «стандартным средством Qt Creator»
Он входит в Qt Framework, а не в Qt Creator IDE. Может для Вас и нет разницы, просто я видимо болезненно воспринял.
Чем больше конструктивной критики, тем лучше! Спасибо Вам за время, уделенное на анализ и критику кода
Sign up to leave a comment.

Articles