Название: Графики в приложении
Отправлено: __Heaven__ от Январь 14, 2012, 12:29
Всем доброго времени суток. Я столкнулся с трудностью. Нашёл в интернете решения QWT и MathGL (более привлекательная по скринам). Как я понял обе эти библиотеки бесплатны, но у меня встал вопрос, как заставить работать одну из этих штук в Visual Studio 2008 да и как потом проверить, работает ли она? Для VS стоит add-in QT. Вот теперь думаю, как соединить всё это.
Название: Re: Графики в приложении
Отправлено: popper от Январь 14, 2012, 16:25
Чтобы заставить работать библиотеку, ее нужно сначала собрать (например так: qmake qwt.pro, потом nmake), а затем разместить файлы библиотеки и заголовочные файлы в, например, в C:\qwt\include и C:\qwt\lib. Далее создаешь тестовый проект, и в файле проекта *.pro прописываешь пути к инклудам и библиотеке (qwt.dll): INCLUDEPATH += C:\qwt\include LIB += -LC:\qwt\lib -lqwt.dll
Библиотеки лучше начать тестировать по примерам, которые с ними поставляются.
Название: Re: Графики в приложении
Отправлено: __Heaven__ от Январь 14, 2012, 19:57
Объясните, пожалуйста, чем отличаются все эти мэйки. есть же ещё make, qmake, cmake... в линуксе как-то всё проще было ./configure, sudo make, sudo make install. Под windows же ниодного проекта я собрать не смог... Наверное, я что-то не установил дополнительно... И я так и не понимаю, если я пользуюсь VS 2008, то я могу использовать файлы, которые содержат в названии фразу "MinGW"?
Название: Re: Графики в приложении
Отправлено: popper от Январь 14, 2012, 21:10
qmake создает из файла проекта *.pro makefile, это Qt альтернатива cmake. nmake - запускает компилятор VS (n)make install, насколько я знаю, выполняет рутину для комфортной работы с библиотекой, например, копирует необходимые файлы библиотеки в определенные директории. Какие именно действия нужно выполнить на этом этапе, определяется в файле конфигурации.
Я собирал qwt по инструкции, которая идет с библиотекой, методом проб и ошибок. Советую прочитать Readme и действовать
Название: Re: Графики в приложении
Отправлено: __Heaven__ от Январь 15, 2012, 13:51
вот ё-моё... а где вводить-то надо эти команды? Через cmd у меня сработала только qmake qwt.pro, nmake, cmake не являются внутренней или внешней командой, исполняемой программой или пакетным файлом, а на make у меня ругнулось следующим сообщением: MAKE Version 5.4 Copiright (c) 1987, 2010 Embarcadero Technologies, Inc. Fatal: 'sub-src-make_default-ordered' does not exist - don't know how to make it Я так понимаю, что тут произошло некое вмешательство дэлфи...
Название: Re: Графики в приложении
Отправлено: popper от Январь 15, 2012, 16:01
пропиши путь к nmake в PATH. nmake запускает компилятор VS
Название: Re: Графики в приложении
Отправлено: kuzulis от Январь 15, 2012, 18:37
Тему нужно было назвать не "Графики в приложении", а "Я нифига не читал, нифига не умею, лень искать в гугле - сделайте всё за меня"!
Ёптить, что сегодня за наплыв таких "программистов"? Сегодня Юпитер в Сатурне, что-ли?
PS: Ребики, вы хоть бы сначала почитали что-нить, а потом на форумы лезли. >:(
Название: Re: Графики в приложении
Отправлено: __Heaven__ от Январь 16, 2012, 22:06
Ребята, что я делаю не так??? (http://img85.imageshack.us/img85/264/26191621.png)
Название: Re: Графики в приложении
Отправлено: popper от Январь 17, 2012, 10:36
перед командой qmake нужно установить: set QMAKESPEC=win32-msvc2008
Название: Re: Графики в приложении
Отправлено: __Heaven__ от Январь 17, 2012, 18:50
не... всё то же...
Название: Re: Графики в приложении
Отправлено: Hellraiser от Январь 17, 2012, 20:51
Судя по заголовку окна на скрине - запуск процесса выполнен напрямую из-под cmd.exe. Это неправильно, для студии надо запускать ее окружение (Пуск - Microsoft Visual Studio 2008 - Visual Studio Tools - Командная строка... или ее аналог для версии en).
Название: Re: Графики в приложении
Отправлено: __Heaven__ от Январь 18, 2012, 11:12
Да. Нужно было мне запуститься из другой командной строки... Проделал qmake qwt.pro nmake nmake install теперь у меня проблема в тестировании библиотеки... я открываю c:\qwt\qwt-6.0.1\examples\sinusplot\sinusplot.cpp через VS2008, при запуске выдает ошибки типа 1>sinusplot.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall QwtPlot::~QwtPlot(void)" (??1QwtPlot@@UAE@XZ) referenced in function __unwindfunclet$??0Plot@@QAE@PAVQWidget@@@Z$0 да и в дизайнере плагины не заработали. Содержимое установленной папки (c:\Qwt-6.0.1\) скопировал в c:\Qt\4.7.4\, что не дало никакого толку. Единственное, что стало работать, так это в креаторе c:\qwt\qwt-6.0.1\examples\sinusplot\sinusplot.pro если открыть. Там прописывются какие-то пути, которых я не понял и компиляция и демонстрация примера идёт спокойно.
Название: Re: Графики в приложении
Отправлено: stima от Январь 18, 2012, 11:16
не реализован деструктор (~QwtPlot()).
Название: Re: Графики в приложении
Отправлено: Hellraiser от Январь 18, 2012, 11:27
Единственное, что стало работать, так это в креаторе c:\qwt\qwt-6.0.1\examples\sinusplot\sinusplot.pro если открыть. Там прописывются какие-то пути, которых я не понял и компиляция и демонстрация примера идёт спокойно.
Вот с этим и надо разбираться - как и где прописывать пути + работе с переменными окружения. Если это не уяснить для себя, то похожие вопросы будут возникать на каждом шагу.
Название: Re: Графики в приложении
Отправлено: Hellraiser от Январь 18, 2012, 11:28
не реализован деструктор (~QwtPlot()).
Иногда лучше молчать, а не говорить глупости.
Название: Re: Графики в приложении
Отправлено: stima от Январь 18, 2012, 11:42
А можно поинтерисоваться (без холивара), где я сказал глупость(чтобы потом не говорить)?
Название: Re: Графики в приложении
Отправлено: __Heaven__ от Январь 18, 2012, 11:56
где прописываются переменные среды я знаю. Вот только не знаю, что конкретно надо добавлять... интуитивно тут не совсем понятно, вот я и хочу научиться это делать с помощью форумчан. В sinusplot.pro оказалось дерево файлов, где sinplot.pro ################################################################ # Qwt Widget Library # Copyright (C) 1997 Josef Wilgen # Copyright (C) 2002 Uwe Rathmann # # This library is free software; you can redistribute it and/or # modify it under the terms of the Qwt License, Version 1.0 ################################################################
include( $${PWD}/../examples.pri )
TARGET = sinusplot
SOURCES = \ sinusplot.cpp
examples\examples.pri ################################################################ # Qwt Widget Library # Copyright (C) 1997 Josef Wilgen # Copyright (C) 2002 Uwe Rathmann # # This library is free software; you can redistribute it and/or # modify it under the terms of the Qwt License, Version 1.0 ###################################################################
QWT_ROOT = $${PWD}/.. include( $${QWT_ROOT}/qwtconfig.pri ) include( $${QWT_ROOT}/qwtbuild.pri )
TEMPLATE = app
INCLUDEPATH += $${QWT_ROOT}/src DEPENDPATH += $${QWT_ROOT}/src DESTDIR = $${QWT_ROOT}/examples/bin
QMAKE_RPATHDIR *= $${QWT_ROOT}/lib
contains(QWT_CONFIG, QwtFramework) {
LIBS += -F$${QWT_ROOT}/lib } else {
LIBS += -L$${QWT_ROOT}/lib }
IPATH = $${INCLUDEPATH} qtAddLibrary(qwt) INCLUDEPATH = $${IPATH}
contains(QWT_CONFIG, QwtSvg) {
QT += svg } else {
DEFINES += QWT_NO_SVG }
win32 { contains(QWT_CONFIG, QwtDll) { DEFINES += QT_DLL QWT_DLL } }
qwtbuild\qwtbuild.pri ############################################################################################################################### # Qwt Widget Library # Copyright (C) 1997 Josef Wilgen # Copyright (C) 2002 Uwe Rathmann # # This library is free software; you can redistribute it and/or # modify it under the terms of the Qwt License, Version 1.0 ################################################################
###################################################################### # qmake internal options ######################################################################
CONFIG += qt CONFIG += warn_on CONFIG += no_keywords CONFIG += silent
###################################################################### # release/debug mode ######################################################################
win32 { # On Windows you can't mix release and debug libraries. # The designer is built in release mode. If you like to use it # you need a release version. For your own application development you # might need a debug version. # Enable debug_and_release + build_all if you want to build both.
CONFIG += debug_and_release CONFIG += build_all } else {
CONFIG += release
VER_MAJ = $${QWT_VER_MAJ} VER_MIN = $${QWT_VER_MIN} VER_PAT = $${QWT_VER_PAT} VERSION = $${QWT_VERSION} }
linux-g++ { # CONFIG += separate_debug_info }
###################################################################### # paths for building qwt ######################################################################
MOC_DIR = moc RCC_DIR = resources !debug_and_release { OBJECTS_DIR = obj }
unix {
exists( $${QMAKE_LIBDIR_QT}/libqwt.* ) {
# On some Linux distributions the Qwt libraries are installed # in the same directory as the Qt libraries. Unfortunately # qmake always adds QMAKE_LIBDIR_QT at the beginning of the # linker path, so that the installed libraries will be # used instead of the local ones.
error( "local build will conflict with $${QMAKE_LIBDIR_QT}/libqwt.*" ) } }
qwtconfig\qwtconfig.pri ################################################################ # Qwt Widget Library # Copyright (C) 1997 Josef Wilgen # Copyright (C) 2002 Uwe Rathmann # # This library is free software; you can redistribute it and/or # modify it under the terms of the Qwt License, Version 1.0 ################################################################
QWT_VER_MAJ = 6 QWT_VER_MIN = 0 QWT_VER_PAT = 1 QWT_VERSION = $${QWT_VER_MAJ}.$${QWT_VER_MIN}.$${QWT_VER_PAT}
###################################################################### # Install paths ######################################################################
QWT_INSTALL_PREFIX = $$[QT_INSTALL_PREFIX]
unix { QWT_INSTALL_PREFIX = /usr/local/qwt-$$QWT_VERSION }
win32 { QWT_INSTALL_PREFIX = C:/Qwt-$$QWT_VERSION }
QWT_INSTALL_DOCS = $${QWT_INSTALL_PREFIX}/doc QWT_INSTALL_HEADERS = $${QWT_INSTALL_PREFIX}/include QWT_INSTALL_LIBS = $${QWT_INSTALL_PREFIX}/lib
###################################################################### # Designer plugin ######################################################################
QWT_INSTALL_PLUGINS = $${QWT_INSTALL_PREFIX}/plugins/designer # QWT_INSTALL_PLUGINS = $${QT_INSTALL_PREFIX}/plugins/designer
###################################################################### # Features # When building a Qwt application with qmake you might want to load # the compiler/linker flags, that are required to build a Qwt application # from qwt.prf. Therefore all you need to do is to add "CONFIG += qwt" # to your project file and take care, that qwt.prf can be found by qmake. # ( see http://doc.trolltech.com/4.7/qmake-advanced-usage.html#adding-new-configuration-features ) # I recommend not to install the Qwt features together with the # Qt features, because you will have to reinstall the Qwt features, # with every Qt upgrade. ######################################################################
QWT_INSTALL_FEATURES = $${QWT_INSTALL_PREFIX}/features # QWT_INSTALL_FEATURES = $${QT_INSTALL_PREFIX}/features
###################################################################### # Build the static/shared libraries. # If QwtDll is enabled, a shared library is built, otherwise # it will be a static library. ######################################################################
QWT_CONFIG += QwtDll
###################################################################### # QwtPlot enables all classes, that are needed to use the QwtPlot # widget. ######################################################################
QWT_CONFIG += QwtPlot
###################################################################### # QwtWidgets enables all classes, that are needed to use the all other # widgets (sliders, dials, ...), beside QwtPlot. ######################################################################
QWT_CONFIG += QwtWidgets
###################################################################### # If you want to display svg images on the plot canvas, or # export a plot to a SVG document ######################################################################
QWT_CONFIG += QwtSvg
###################################################################### # You can use the MathML renderer of the Qt solutions package to # enable MathML support in Qwt. Because of license implications # the ( modified ) code of the MML Widget solution is included and # linked together with the QwtMathMLTextEngine into an own library. # To use it you will have to add "CONFIG += qwtmathml" # to your qmake project file. ######################################################################
QWT_CONFIG += QwtMathML
###################################################################### # If you want to build the Qwt designer plugin, # enable the line below. # Otherwise you have to build it from the designer directory. ######################################################################
QWT_CONFIG += QwtDesigner
###################################################################### # If you want to auto build the examples, enable the line below # Otherwise you have to build them from the examples directory. ######################################################################
# QWT_CONFIG += QwtExamples
###################################################################### # When Qt has been built as framework qmake ( qtAddLibrary ) wants # to link frameworks instead of regular libs ######################################################################
macx:CONFIG(qt_framework, qt_framework|qt_no_framework) {
QWT_CONFIG += QwtFramework }
Ну и в исходниках код самой программы, записанный в файл sinusplot.cpp Надеюсь на помощь, так как я не смог отсюда ничего для себя извлечь...
Название: Re: Графики в приложении
Отправлено: popper от Январь 18, 2012, 12:00
Посмотри мой первый ответ про INCLUDEPATH
Название: Re: Графики в приложении
Отправлено: Hellraiser от Январь 18, 2012, 12:07
А можно поинтерисоваться (без холивара), где я сказал глупость(чтобы потом не говорить)?
Можно. ТС пишет что в самой студии получает ошибку, а в креаторе - все как надо. Уже это одно должно навести на размышления, что с самими исходниками все ОК, а проблема где-то в конфигурации/путях. Кроме того, когда выскакивает unresolved external для своей программы, это может указывать либо на отсутствие реализации метода и т.п., либо на неслинкованную либу. Но у ТС открыт стандартный пример из самой Qwt. В таком случае, такая ошибка выскакивала бы у всех, кто пользуется Qwt. А ведь она работает без явных проблем. Так что вывод следует однозначный.
Название: Re: Графики в приложении
Отправлено: Hellraiser от Январь 18, 2012, 12:14
Укажи в настройках студии полные пути к заголовкам Qt + Qwt, а также пути к либам (именно *.lib, а не *.dll) Qt и Qwt. Файлы *.dll должны находиться в переменной окружения PATH. Пример: В переменных окружения (лучше даже в пользовательских) указываем QTDIR=C:\Qt\4.7.4 PATH=%QTDIR%\Bin;%QTDIR%\Qwt6\Bin <-- это если Qwt размещено в папке Qt
Название: Re: Графики в приложении
Отправлено: stima от Январь 18, 2012, 12:17
Ну так в итоге я прав?), метод то не реализован. Да я не указал причину(как возможную Вы привели это неправильная линковка).
Название: Re: Графики в приложении
Отправлено: Hellraiser от Январь 18, 2012, 12:20
Опять заново - как может быть не реализован метод в стандартном примере??? Не реализован - это когда в заголовке он указан, в исходнике - нет. Как можно не реализовать деструктор библиотечного класса??? За него это уже сделал автор библиотеки.
Название: Re: Графики в приложении
Отправлено: mutineer от Январь 18, 2012, 12:21
Ну так в итоге я прав?), метод то не реализован. Да я не указал причину(как возможную Вы привели это неправильная линковка).
То есть ты предлагаешь ТС пойти и реализовать деструктор? именно к этому призывает твое "пояснение"
Название: Re: Графики в приложении
Отправлено: stima от Январь 18, 2012, 12:32
Кто сказал, что я предлагаю его реализовывать. Я просто указал, что реализация деструктора не видна компилятору по некоторым причинам.
п.с. На этом, я хочу прекратить дисскусию по данному поводу, будем считать, что я не правильно выразился.
Название: Re: Графики в приложении
Отправлено: Hellraiser от Январь 18, 2012, 12:49
Будем считать, что и я слегка погорячился с эпитетами, но все-таки подсказки такого рода лучше не давать начинающим. Они могут их только ввести в лишнее заблуждение.
Название: Re: Графики в приложении
Отправлено: __Heaven__ от Январь 19, 2012, 11:22
Qwt6\Bin папки у меня вовсе нет ни в исходниках, ни в папке установленной сборки. QTDIR=C:\Qt\4.7.4 прописалось у меня автоматически при установке Qt. В студии в настройках VC++ directories прописаны строчки: Include files: C:\qwt-6\src C:\Qwt-6.0.1\include C:\Qt\4.7.4\include и остальные, стандартные Library files: C:\qwt-6\lib C:\Qt\4.7.4\lib C:\Qwt-6.0.1\lib и остальные, стандартные. Не понимаю, что же может быть не так... Вот ещё исходник самого примера, может он чем-то сможет помочь: #include <qapplication.h> #include <qlayout.h> #include <qwt_plot.h> #include <qwt_plot_marker.h> #include <qwt_plot_curve.h> #include <qwt_legend.h> #include <qwt_series_data.h> #include <qwt_plot_canvas.h> #include <qwt_plot_panner.h> #include <qwt_plot_magnifier.h> #include <qwt_text.h> #include <qwt_math.h> #include <math.h>
//----------------------------------------------------------------- // simple.cpp // // A simple example which shows how to use QwtPlot connected // to a data class without any storage, calculating each values // on the fly. //-----------------------------------------------------------------
class FunctionData: public QwtSyntheticPointData { public: FunctionData(double(*y)(double)): QwtSyntheticPointData(100), d_y(y) { }
virtual double y(double x) const { return d_y(x); }
private: double(*d_y)(double); };
class Plot : public QwtPlot { public: Plot( QWidget *parent = NULL);
protected: virtual void resizeEvent( QResizeEvent * );
private: void populate(); void updateGradient(); };
Plot::Plot(QWidget *parent): QwtPlot( parent ) { // panning with the left mouse button (void) new QwtPlotPanner( canvas() );
// zoom in/out with the wheel (void) new QwtPlotMagnifier( canvas() );
setAutoFillBackground( true ); setPalette( QPalette( QColor( 165, 193, 228 ) ) ); updateGradient();
setTitle("A Simple QwtPlot Demonstration"); insertLegend(new QwtLegend(), QwtPlot::RightLegend);
// axes setAxisTitle(xBottom, "x -->" ); setAxisScale(xBottom, 0.0, 10.0);
setAxisTitle(yLeft, "y -->"); setAxisScale(yLeft, -1.0, 1.0);
// canvas canvas()->setLineWidth( 1 ); canvas()->setFrameStyle( QFrame::Box | QFrame::Plain ); canvas()->setBorderRadius( 15 );
QPalette canvasPalette( Qt::white ); canvasPalette.setColor( QPalette::Foreground, QColor( 133, 190, 232 ) ); canvas()->setPalette( canvasPalette );
populate(); }
void Plot::populate() { // Insert new curves QwtPlotCurve *cSin = new QwtPlotCurve("y = sin(x)"); cSin->setRenderHint(QwtPlotItem::RenderAntialiased); cSin->setLegendAttribute(QwtPlotCurve::LegendShowLine, true); cSin->setPen(QPen(Qt::red)); cSin->attach(this);
QwtPlotCurve *cCos = new QwtPlotCurve("y = cos(x)"); cCos->setRenderHint(QwtPlotItem::RenderAntialiased); cCos->setLegendAttribute(QwtPlotCurve::LegendShowLine, true); cCos->setPen(QPen(Qt::blue)); cCos->attach(this);
// Create sin and cos data cSin->setData(new FunctionData(::sin)); cCos->setData(new FunctionData(::cos));
// Insert markers // ...a horizontal line at y = 0... QwtPlotMarker *mY = new QwtPlotMarker(); mY->setLabel(QString::fromLatin1("y = 0")); mY->setLabelAlignment(Qt::AlignRight|Qt::AlignTop); mY->setLineStyle(QwtPlotMarker::HLine); mY->setYValue(0.0); mY->attach(this);
// ...a vertical line at x = 2 * pi QwtPlotMarker *mX = new QwtPlotMarker(); mX->setLabel(QString::fromLatin1("x = 2 pi")); mX->setLabelAlignment(Qt::AlignLeft | Qt::AlignBottom); mX->setLabelOrientation(Qt::Vertical); mX->setLineStyle(QwtPlotMarker::VLine); mX->setLinePen(QPen(Qt::black, 0, Qt::DashDotLine)); mX->setXValue(2.0 * M_PI); mX->attach(this); }
void Plot::updateGradient() { QPalette pal = palette();
const QColor buttonColor = pal.color( QPalette::Button );
#ifdef Q_WS_X11 // Qt 4.7.1: QGradient::StretchToDeviceMode is buggy on X11
QLinearGradient gradient( rect().topLeft(), rect().bottomLeft() ); gradient.setColorAt( 0.0, Qt::white ); gradient.setColorAt( 0.7, buttonColor ); gradient.setColorAt( 1.0, buttonColor ); #else QLinearGradient gradient( 0, 0, 0, 1 ); gradient.setCoordinateMode( QGradient::StretchToDeviceMode ); gradient.setColorAt( 0.0, Qt::white ); gradient.setColorAt( 0.7, buttonColor ); gradient.setColorAt( 1.0, buttonColor ); #endif
pal.setBrush( QPalette::Window, gradient ); setPalette( pal ); }
void Plot::resizeEvent( QResizeEvent *event ) { QwtPlot::resizeEvent( event ); #ifdef Q_WS_X11 updateGradient(); #endif }
int main(int argc, char **argv) { QApplication a(argc, argv);
Plot *plot = new Plot();
// We put a dummy widget around to have // so that Qt paints a widget background // when resizing
QWidget window; QHBoxLayout *layout = new QHBoxLayout( &window ); layout->setContentsMargins( 0, 0, 0, 0 ); layout->addWidget( plot );
window.resize(600,400); window.show();
return a.exec(); }
Название: Re: Графики в приложении
Отправлено: Witcher от Январь 23, 2012, 00:00
Извините за отхождение от темы, а не легче бы было нарисовать самому графики. через тож же QPainter? За эти дни пока ты настраиваешь библиотеки ты мог бы все ручками написать, раз в сто лучше и "по своему вкусу". :)
|