Skip to content

Grafici matematici con Qwt

La libreria Qwt (“Qt Widgets for Technical Applications”) è un insieme di widget per le Qt specifico per applicazioni di laboratorio. Troviamo widget di ogni tipo: grafici, scale, bussole, termometri, tachigrafi. Tutti componenti ottimi per lo sviluppo di applicazioni industriali (ad esempio monitor di controllo e misura) che ricordano molto software come LabView. Su Ubuntu potete installare comodamente le Qwt con apt-get.

Questo piccolo esempio mostra come utilizzare i componenti QwtPlot e QwtPlotCurve per realizzare grafici di semplici funzioni matematiche come sin() e cos(). L’oggetto QwtPlot rappresenta il grafico “contenitore” mentre QwtPlotCurve rappresenta la funzione (curva). Ad un QwtPlot possono essere collegate più QwtPlotCurve.

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QtGui/QMainWindow>
#include <qwt_plot_curve.h>
#include <qwt_data.h>
 
namespace Ui
{
    class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private:
    Ui::MainWindow *ui;
    QwtPlotCurve *curve_cos;
    QwtPlotCurve *curve_sin;
    QwtPlotCurve *curve_tan;
    QwtPlotCurve *curve_log;
 
    int size;
    int pen_width;
    int max_x;
    int max_y;
    int min_y;
 
    void draw_sin();
    void draw_cos();
    void draw_tan();
    void draw_log();
 
private slots:
    void on_slide_size_sliderMoved(int position);
    void on_slide_max_y_sliderMoved(int position);
    void on_slide_max_x_sliderMoved(int position);
    void on_btn_log_clicked();
    void on_cmd_clear_clicked();
    void on_btn_tan_clicked();
    void on_btn_cos_clicked();
    void on_btn_sin_clicked();
};
 
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <math.h>
 
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    size = 500;
    pen_width = 2;
    max_x = 20;
    max_y = 3;
    min_y = -3;
 
    ui->setupUi(this);
 
    ui->slide_max_x->setValue(max_x);
    ui->slide_max_y->setValue(max_y);
    ui->slide_size->setValue(size);
 
    ui->grafico->setCanvasBackground(Qt::white);
    ui->grafico->setAxisScale(0, min_y, max_y, 0);
 
    curve_sin = new QwtPlotCurve("Sin(x)");
    curve_sin->setRenderHint(QwtPlotItem::RenderAntialiased);
    curve_sin->setPen(QPen(Qt::blue, pen_width));
    curve_sin->setStyle(QwtPlotCurve::Lines);
    curve_sin->attach(ui->grafico);
    curve_sin->setVisible(false);
 
    curve_cos = new QwtPlotCurve("Cos(x)");
    curve_cos->setRenderHint(QwtPlotItem::RenderAntialiased);
    curve_cos->setPen(QPen(Qt::red, pen_width));
    curve_cos->setStyle(QwtPlotCurve::Lines);
    curve_cos->attach(ui->grafico);
    curve_cos->setVisible(false);
 
    curve_tan = new QwtPlotCurve("Tan(x)");
    curve_tan->setRenderHint(QwtPlotItem::RenderAntialiased);
    curve_tan->setPen(QPen(Qt::magenta, pen_width));
    curve_tan->setStyle(QwtPlotCurve::Lines);
    curve_tan->attach(ui->grafico);
    curve_tan->setVisible(false);
 
    curve_log = new QwtPlotCurve("Log(x)");
    curve_log->setRenderHint(QwtPlotItem::RenderAntialiased);
    curve_log->setPen(QPen(Qt::green, pen_width));
    curve_log->setStyle(QwtPlotCurve::Lines);
    curve_log->attach(ui->grafico);
    curve_log->setVisible(false);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_btn_sin_clicked()
{
    draw_sin();
    ui->grafico->replot();
}
 
void MainWindow::on_btn_cos_clicked()
{
    draw_cos();
    ui->grafico->replot();
}
 
void MainWindow::on_btn_tan_clicked()
{
    draw_tan();
    ui->grafico->replot();
}
 
void MainWindow::on_btn_log_clicked()
{
    draw_log();
    ui->grafico->replot();
}
 
void MainWindow::on_cmd_clear_clicked()
{
    curve_sin->setVisible(false);
    curve_cos->setVisible(false);
    curve_tan->setVisible(false);
    curve_log->setVisible(false);
 
    ui->grafico->replot();
}
 
void MainWindow::on_slide_max_x_sliderMoved(int position)
{
    max_x = position;
 
    if(curve_sin->isVisible())
        draw_sin();
    if(curve_cos->isVisible())
        draw_cos();
    if(curve_tan->isVisible())
        draw_tan();
    if(curve_log->isVisible())
        draw_log();
 
    ui->grafico->replot();
}
 
void MainWindow::on_slide_max_y_sliderMoved(int position)
{
    max_y = position;
    min_y = -position;
 
    ui->grafico->setAxisScale(0, min_y, max_y, 0);
 
    ui->grafico->replot();
}
 
void MainWindow::on_slide_size_sliderMoved(int position)
{
    size = position;
 
    if(curve_sin->isVisible())
        draw_sin();
    if(curve_cos->isVisible())
        draw_cos();
    if(curve_tan->isVisible())
        draw_tan();
    if(curve_log->isVisible())
        draw_log();
 
    ui->grafico->replot();
}
 
void MainWindow::draw_sin()
{
    double xval[size];
    double yval[size];
 
    for(int i=0; i<size; i++)
    {
        xval[i] = double(i) * max_x / double(size - 1);
        yval[i] = sin(xval[i]);
    }
 
    curve_sin->setData(xval, yval, size);
 
    if(!curve_sin->isVisible())
        curve_sin->setVisible(true);
}
 
void MainWindow::draw_cos()
{
    double xval[size];
    double yval[size];
 
    for(int i=0; i<size; i++)
    {
        xval[i] = double(i) * max_x / double(size - 1);
        yval[i] = cos(xval[i]);
    }
 
    curve_cos->setData(xval, yval, size);
 
    if(!curve_cos->isVisible())
        curve_cos->setVisible(true);
}
 
void MainWindow::draw_tan()
{
    double xval[size];
    double yval[size];
 
    for(int i=0; i<size; i++)
    {
        xval[i] = double(i) * max_x / double(size - 1);
        yval[i] = tan(xval[i]);
    }
 
    curve_tan->setData(xval, yval, size);
 
    if(!curve_tan->isVisible())
        curve_tan->setVisible(true);
}
 
void MainWindow::draw_log()
{
    double xval[size];
    double yval[size];
 
    for(int i=0; i<size; i++)
    {
        xval[i] = double(i) * max_x / double(size - 1);
        yval[i] = log(xval[i]);
    }
 
    curve_log->setData(xval, yval, size);
 
    if(!curve_log->isVisible())
        curve_log->setVisible(true);
}

grafico

Sorgenti del progetto
Sorgente grafico qwt (327)

Categories: Qt.

Tags: , , ,

Comment Feed

9 Responses

  1. cia! c’è un sito ke t disegna i grafici delle funzioni?? se si m potreste dare il link del sitox favore? urgente!

    sporternährungNovember 28, 2009 @ 10:14
  2. ciao, vorrei un info riguardo il codice da te rilasciato.
    nel file mainwindow.cpp che widget è grafico?
    grazie

    LillyAugust 26, 2010 @ 11:50
  3. Ciao. grafico è il nome del QwtPlot. Se apri mainwindow.ui lo vedi nelle proprietà del widget.

    adminAugust 27, 2010 @ 04:35
  4. ciao, si ho visto, il mio problema è come si fa ad aggiungerlo? tra i widget standard non c’è, ed in effetti quando apro il file .ui lo vedo, ma non posso modificarlo.
    ho compilato le qwt includendo nel file .pro del progetto il path dove le ho, e adesso mi sorge il dubbio se devo fare ulteriori modifiche o installazioni.
    grazie in anticipo per la risposta

    LillyAugust 29, 2010 @ 09:45
  5. grazie, ho risolto :)

    LillyAugust 29, 2010 @ 10:59
  6. Come hai risolto?

    adminAugust 29, 2010 @ 11:17
  7. ciao, semplicemente ho evitato di creare graficamente la finestra, ho scritto solo codice ed ho implementato la funzione da plottare.farò delle prove piu articolate, ma credo che vada bene.
    grazie

    LillyAugust 30, 2010 @ 05:00
  8. Quando compili qwt, nella cartella designer/plugins/designer/ trovi il file libqwtplugin.so che devi copiare nella cartella dei plugin di qtcreator. Se hai scaricato l’sdk dal sito delle Qt, questa cartella è cartellasdk/qt/plugins/designer

    adminAugust 30, 2010 @ 05:06



Some HTML is OK

or, reply to this post via trackback.

*

Tutto il materiale di questo blog è rilasciato sotto licenza GNU FDL