Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [QT] Рисование графика


Автор: rcdimon 25.10.2009, 20:25
Я начинающий в QT.

Возникла необходимость написать программу, отображающая график. График должен строиться в режиме реального времени. Данные приходят на COM порт и каждый раз при поступлении следующих данных график должен дорисовываться. Некий самописец.

Мне удалось с помощью QPainter нарисовать график по заранее определенному масиву данных, а вот осуществить его "дорисовку" не получается. Ведь рисовать можно только в ::paintEvent. 

Какой самый простой метод сделать рисование линии по событию? Например нажатию на кнопку, или приходу данных с ком-порта и т.д.?

Автор: Pion 25.10.2009, 21:10
наверное, вызвать update в методе... Update в свою очередь вызовет repaint.

Автор: rcdimon 25.10.2009, 22:46
Я пробовал, но при этом начинает подтормаживать...

Автор: CuteBunny 27.10.2009, 05:46
А если юзать qwtlib???

Там точно помню в одном из примеров график рисовался в режиме реального времени, но данные были рандомные?

Автор: rcdimon 27.10.2009, 11:34
Вобщем я тоже смотрю в сторону QWT. Установил, примеры покурил. Однако происходит странная вещь- программа нормально компилируется и запускается, но сразу закрывается с кодом завершения 1. Никаких ошибок опять же не выводит.

Вот код.

Код

Test_qwt::Test_qwt(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    ui.setupUi(this);

    double X1[20], Y1[20],X2[20], Y2[20];
    int Size,i;

    Size = 20;

    for (i=0;i<20;i++){
        X1[i] = rand()/32;
        Y1[i] = rand()/32;
        X2[i] = rand()/32;
        Y2[i] = rand()/32;
    }

    QwtPlot *myPlot = new QwtPlot(tr("Test"), this);

    // add curves
    QwtPlotCurve *curve1 = new QwtPlotCurve("Curve 1");
    QwtPlotCurve *curve2 = new QwtPlotCurve("Curve 2");

    curve1->setPen(QPen(Qt::red));
            curve2->setPen(QPen(Qt::blue));

    // copy the data into the curves
    curve1->setData(X1,Y1,Size);
    curve2->setData(X2,Y2,Size);

    curve1->attach(myPlot);
    curve2->attach(myPlot);

    // finally, refresh the plot
    myPlot->replot();

}


Если делать отладку по шагам, то вылетает с кодом 1 на строке

Код

QwtPlot *myPlot = new QwtPlot(tr("Test"), this);


В чем может быть проблема? У меня VS2008 QT4.5.0 QWT5.2.0

Автор: CuteBunny 28.10.2009, 06:08
Думаю вот эти переменные лучше описать, как члены класса (private конечно же):

Код

    QwtPlot *myPlot;
    QwtPlotCurve *curve1;
    QwtPlotCurve *curve2;


Потом уже создавать их в конструкторе. Еще, я так понял, что в QDesigner'е, вы не используете плагины для работы с qwt? Так гораздо легче, если уж вы
используете шаблоны gui.



Автор: ecspertiza 28.10.2009, 11:07
С какой скоростью приходят данные с прибора?

Я реализовал тестовый примерчик рисования графика при помощи painterEvent(), посмотри может поможет, тормозов не замечал, данные приходят рандомом по таймеру 10 раз в секунду.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)