Russian Qt Forum

Qt => Вопросы новичков => Тема начата: __Heaven__ от Январь 14, 2012, 12:29



Название: Графики в приложении
Отправлено: __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? За эти дни пока ты настраиваешь библиотеки ты мог бы все ручками написать, раз в сто лучше и "по своему вкусу". :)