Russian Qt Forum
Ноябрь 24, 2024, 04:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Qwt график  (Прочитано 11338 раз)
Петр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));
Класс написан так, что функция возвращает общие аргументы и для косинуса и для синуса, объясните как мне их разделить и как построить график допустим обычной параболы...
Записан
Петр91
Гость
« Ответ #1 : Июнь 11, 2011, 16:11 »

Народ помогите! НУ чтоб разделить я уже догадся что можно два класса сделать, а как сделать просто параболу? без синусов и других функций
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #2 : Июнь 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; }
   ...
};
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Петр91
Гость
« Ответ #3 : Июнь 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. не пинайте нуба
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #4 : Июнь 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;
}
 
« Последнее редактирование: Июнь 12, 2011, 11:59 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Петр91
Гость
« Ответ #5 : Июнь 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+...
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #6 : Июнь 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++, практически в первых главах..
« Последнее редактирование: Июнь 14, 2011, 12:47 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
tiiL
Гость
« Ответ #7 : Июнь 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 (цель: Настольный компьютер)
Во время выполнения сборки на этапе "Сборка"
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #8 : Июнь 16, 2011, 17:04 »

Ну как минимум нужно реализовать функцию
Код
C++ (Qt)
void setDamp(double damping);
 
раз уж она объявлена.
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
tiiL
Гость
« Ответ #9 : Июнь 16, 2011, 22:55 »

Ну как минимум нужно реализовать функцию
Код
C++ (Qt)
void setDamp(double damping);
 
раз уж она объявлена.


ВРоде она реализовываетца в  СРР файле
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #10 : Июнь 16, 2011, 23:28 »

Ну как минимум нужно реализовать функцию
Код
C++ (Qt)
void setDamp(double damping);
 
раз уж она объявлена.


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

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
tiiL
Гость
« Ответ #11 : Июнь 17, 2011, 07:45 »

Ну как минимум нужно реализовать функцию
Код
C++ (Qt)
void setDamp(double damping);
 
раз уж она объявлена.


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

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


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

Сообщений: 606



Просмотр профиля
« Ответ #12 : Июнь 17, 2011, 08:15 »

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

сделайте очистку проекта ( make clean или mingw32-make clean )
Записан
tiiL
Гость
« Ответ #13 : Июнь 17, 2011, 08:44 »

1-ое: я правильно понимаю что надо "сделать сборка" -> "очистить проект "название проекта""? если так то ничего не меняется.

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

Сообщений: 606



Просмотр профиля
« Ответ #14 : Июнь 17, 2011, 10:48 »

Ошибка в том, что вы не добавили Plot на MainWindow
« Последнее редактирование: Июнь 17, 2011, 10:56 от alex312 » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.476 секунд. Запросов: 22.