Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Петр91 от Июнь 10, 2011, 04:45



Название: Qwt график
Отправлено: Петр91 от Июнь 10, 2011, 04:45
Здравствуйте, не могу разобраться с классом в qwt! Пример идет с qwt. Проблема такая. Есть класс
Код:
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);
};

И часть кода

Код:
 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));
Класс написан так, что функция возвращает общие аргументы и для косинуса и для синуса, объясните как мне их разделить и как построить график допустим обычной параболы...


Название: Re: Qwt график
Отправлено: Петр91 от Июнь 11, 2011, 16:11
Народ помогите! НУ чтоб разделить я уже догадся что можно два класса сделать, а как сделать просто параболу? без синусов и других функций


Название: Re: Qwt график
Отправлено: m_ax от Июнь 11, 2011, 16:51
Странный вопрос. Наверное просто написать свою функцию - параболу.

Код
C++ (Qt)
class Parabola: public QwtSyntheticPointData
{
public:
   Parabola(): QwtSyntheticPointData(100)
   {
   }
 
   virtual double y(double x) const
   {
       return m_a*x*x+m_b*x+m_c;
   }
   double a() const { return m_a; }
   double b() const { return m_b; }
   double c() const { return m_c; }
   void setA(const double &a) { m_a = a; }
   ...
};
 


Название: Re: Qwt график
Отправлено: Петр91 от Июнь 12, 2011, 11:48
Спасибо! Но я не могу разобраться с виртуальной функцией.
Код:
class Parabola: public QwtSyntheticPointData
{
public:
    Parabola(): QwtSyntheticPointData(100)
    {
    }
 
    virtual double y(double x) const
    {
        return m_a*x*x+m_b*x+m_c;
    }
    double a() const { return m_a; }
    double b() const { return m_b; }
    double c() const { return m_c; }
    void setA(const double &a) { m_a = a; }
    ...
};

Вот вы создаете наследованный класс, а потом виртуальная функция! Объясните пожалуйста как работает дальше класс.. и как создать элемент класса setData->(new Parabola(что здесь)); P.S. не пинайте нуба


Название: Re: Qwt график
Отправлено: m_ax от Июнь 12, 2011, 11:56
С Qwt я плохо знаком, но могу предположить, что нужно делать как то так:
Код
C++ (Qt)
   QwtPlotCurve *parabola = new QwtPlotCurve("y = a*x^2+b*x+c");
   parabola->setRenderHint(QwtPlotItem::RenderAntialiased);
   parabola->setLegendAttribute(QwtPlotCurve::LegendShowLine, true);
   parabola->setPen(QPen(Qt::red));
   parabola->attach(this);
 
   paradola->setData(new Parabola(a, b, c));
 

где Parabola:
Код
C++ (Qt)
class Parabola: public QwtSyntheticPointData
{
public:
   Parabola(const double &a = 1.0, const double &b = 0.0, const double &c = 0.0)
       : QwtSyntheticPointData(100), m_a(a), m_b(b), m_c(c)
   {
   }
 
   virtual double y(double x) const
   {
       return m_a*x*x+m_b*x+m_c;
   }
   double m_a;
   double m_b;
   double m_c;
}
 


Название: Re: Qwt график
Отправлено: Петр91 от Июнь 14, 2011, 07:45
Аааааааа!!! Спасибо большущее!! Вы не представляете как помогли студенту в неделю холодной сессии :) Мне нехватило знаний разобраться в классе, можете объяснить пару моментов?
const double &a = 1.0, const double &b = 0.0, const double &c = 0.0 - что это строчка значит? Как я понял это те переменные которые будут передаваться в функцию, но что за цифры и зачем знак амперсанта?
m_a(a), m_b(b), m_c(c) - что это за объявления и почему напрямую нельзя было написать a*x*x+...


Название: Re: Qwt график
Отправлено: m_ax от Июнь 14, 2011, 12:10
const double &a = 1.0, const double &b = 0.0, const double &c = 0.0 - что это строчка значит? Как я понял это те переменные которые будут передаваться в функцию, но что за цифры и зачем знак амперсанта?
m_a(a), m_b(b), m_c(c) - что это за объявления и почему напрямую нельзя было написать a*x*x+...
Это означает, передачу значений по константной ссылки. В противном случае, будет создана внутренняя копия переменной, передаваемой через аргумент функции. Для типа double, наверное нет особой разницы как писать:
Код
C++ (Qt)
const double &value
 
 
или просто
Код
C++ (Qt)
double value
 
Но если тип будет по-жирнее, то лучше использовать передачу по ссылке.
Числа - это значения по умолчанию.

И вообще, всё это есть в любом учебнике по c++, практически в первых главах..


Название: Re: Qwt график
Отправлено: tiiL от Июнь 16, 2011, 16:06
Для изучения QWT  построения графиков взял пример Bode, и попытался его разобрать: тоесть реализовать только файлы plot.cpp и plot.h и сделал это я это в ппроекте вложенном в сообщение.

а проблема в том что выдает кучу ошибок, наругайте меня чего я не так делаю.

ошибки вот:
debug/plot.o: In function `Plot':

E:\QWTproject\QWTplotter/plot.cpp:37: undefined reference to `vtable for Plot'

E:\QWTproject\QWTplotter/plot.cpp:37: undefined reference to `vtable for Plot'

E:\QWTproject\QWTplotter/plot.cpp:37: undefined reference to `vtable for Plot'

E:\QWTproject\QWTplotter/plot.cpp:97: undefined reference to `Plot::setDamp(double)'

E:\QWTproject\QWTplotter/plot.cpp:37: undefined reference to `vtable for Plot'

E:\QWTproject\QWTplotter/plot.cpp:37: undefined reference to `vtable for Plot'

E:\QWTproject\QWTplotter/plot.cpp:37: undefined reference to `vtable for Plot'

E:\QWTproject\QWTplotter/plot.cpp:97: undefined reference to `Plot::setDamp(double)'

collect2: ld returned 1 exit status

mingw32-make[1]: *** [debug\QWTplotter.exe] Error 1

mingw32-make: *** [debug] Error 2

Процесс "C:/Qt/2010.05/mingw/bin/mingw32-make.exe" завершился с кодом %2.
Возникла ошибка при сборке проекта QWTplotter (цель: Настольный компьютер)
Во время выполнения сборки на этапе "Сборка"


Название: Re: Qwt график
Отправлено: m_ax от Июнь 16, 2011, 17:04
Ну как минимум нужно реализовать функцию
Код
C++ (Qt)
void setDamp(double damping);
 
раз уж она объявлена.


Название: Re: Qwt график
Отправлено: tiiL от Июнь 16, 2011, 22:55
Ну как минимум нужно реализовать функцию
Код
C++ (Qt)
void setDamp(double damping);
 
раз уж она объявлена.


ВРоде она реализовываетца в  СРР файле


Название: Re: Qwt график
Отправлено: m_ax от Июнь 16, 2011, 23:28
Ну как минимум нужно реализовать функцию
Код
C++ (Qt)
void setDamp(double damping);
 
раз уж она объявлена.


ВРоде она реализовываетца в  СРР файле
Ну да.. Тока вот закоментирована)


Название: Re: Qwt график
Отправлено: tiiL от Июнь 17, 2011, 07:45
Ну как минимум нужно реализовать функцию
Код
C++ (Qt)
void setDamp(double damping);
 
раз уж она объявлена.


ВРоде она реализовываетца в  СРР файле
Ну да.. Тока вот закоментирована)

всё раскоментировал, добавил файл комплекс.h, все ошибки убрались, НО когда запускаю программу то кроме пустого окошка виджет ничего не выводитца.  Или в чем моя ошибка?


PS: не могу выложить файл zip с проектом так как он больше 500КБ


Название: Re: Qwt график
Отправлено: alex312 от Июнь 17, 2011, 08:15
PS: не могу выложить файл zip с проектом так как он больше 500КБ

сделайте очистку проекта ( make clean или mingw32-make clean )


Название: Re: Qwt график
Отправлено: tiiL от Июнь 17, 2011, 08:44
1-ое: я правильно понимаю что надо "сделать сборка" -> "очистить проект "название проекта""? если так то ничего не меняется.

2-ое: что насчет проекта то. в чем моя ошибка? помогите плииз


Название: Re: Qwt график
Отправлено: alex312 от Июнь 17, 2011, 10:48
Ошибка в том, что вы не добавили Plot на MainWindow


Название: Re: Qwt график
Отправлено: tiiL от Июнь 17, 2011, 13:56
Ошибка в том, что вы не добавили Plot на MainWindow

Спасибо за помощь... Ваш файл который вы мне скинули немножко подправил:

1. добавил complexnumber.h;
2. расскомментрировал все коменты. так же раскоментировал ссылки на библиотеки свои;
3. закоментрировал строчку #include( ./qwt6.pri );

Теперь рисует всё что нужно рисует, но теперь понять что нужно сделать чтоб он строил график.


Название: Re: Qwt график
Отправлено: alex312 от Июнь 17, 2011, 14:58
Код
C++ (Qt)
 
   double Xdat[] = {1.0,2.0,3.0};
   double Ydat[] = {0,5.0,7.0};
 
   d_curve1->setSamples(Xdat,Ydat,3);
 
   replot();
 
 


Название: Re: Qwt график
Отправлено: tiiL от Июнь 20, 2011, 13:45
Спасибо огромное запомощь, очень вё хорошо работает... но возникли вопросы:

1-ый:
вот код
Код
C++ (Qt)
QToolButton *btnExport = new QToolButton(toolBar);
   btnExport->setText("Export");
   btnExport->setIcon(QIcon(print_xpm));
   btnExport->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
   toolBar->addWidget(btnExport);
   connect(btnExport, SIGNAL(clicked()), SLOT(exportDocument()));
 
ругается на "toolBar" "print_xpm", хотя библиотеки к ним прописал вот так:
Код
C++ (Qt)
#include <qtoolbar.h>
#include <QtCore> &#1101;&#1090;&#1086; &#1082; print_xpm.
 
почему ругается?

2-ое:
Код
C++ (Qt)
double Xdat[] = {1.0,2.0,3.0};
   double Ydat[] = {0,5.0,7.0};
 
   d_curve1->setSamples(Xdat,Ydat,3);
 
   replot();
 

очень все помогло, но я так понимаю это просто точки котоыре рисуются на координатных осях(декартовых), а если рисовать для логарифмических осей какие нужны значения(извеняюсь: чисто за математику...).

3-ие(ради интереса):

в примере  bode, есть файл pixmaps.h что он делает расскажите пожалуйста...


премного благодарен.