使用Qt的ECG信号抽屉

时间:2017-02-19 11:12:15

标签: qt real-time

我正在开发心电图应用程序。它每2毫秒获得一次心电图样本。 我的绘图机制如下: 1-缓冲样品 每30毫秒检查一次缓冲液并抽取样品(约15个样品)。 3-在每个时期使用QPainterPath。

我的示例代码如下所示,请注意,在此代码中,我从文件中读取样本!

1)widget.h文件:

class Widget : public QWidget
{
    Q_OBJECT
    int idx=0;
    QTimer timer;
public:
    explicit Widget(QWidget *parent=0);

    void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
public:
    QStringList list;
    float x=0;
    QPointF aa;
public slots:
    void changeT(){update();}
};

2)widget.cpp

#include "widget.h"
Widget::Widget(QWidget *parent) : QWidget(parent),aa(0,0)
{
    connect(&timer,SIGNAL(timeout()),this,SLOT(changeT()));
    timer.start(25);
}

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter;
    painter.begin(this);
    painter.setPen(QPen(Qt::black, 0.5, Qt::SolidLine, Qt::RoundCap));
    QPainterPath path;
    path.moveTo(aa);
    for(int i=idx; i<idx+25 ; i++)
    {
        QPointF bb(x, list.at(i).toInt());
        x+=0.25;
        path.quadTo(aa,bb);
        aa=bb;
    }
    idx+=25;

    painter.drawPath(path);
    QWidget::paintEvent(event);
    painter.end();
}

3)main.cpp

#include "widget.h"
bool ECG_data(QStringList& strings)
{
    QFile file("/home/amvajnegar/ecg.txt");
    if (file.open(QIODevice::ReadOnly))
    {
        QTextStream in(&file);
        while(!in.atEnd())
        {
            strings<< in.readLine();
        }
        return true;
    }
    return false;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QStringList lst;

    if(!ECG_data(lst))
    {
        qDebug()<<"nothing!";
        return 0;
    }
    Widget wid;
    wid.list = lst;
    wid.show();
    return a.exec();
}

现在我的问题是:

  

1-当我在每个时期绘制新样本时,应用程序将被删除   之前绘制的曲线!所以我总是只有一小部分曲线!我该如何解决这个问题?

     

2-我的嵌入式主板CPU使用率为100%。我怎么能减少它?对于   例如,我如何使用边界矩形或任何其他想法?

     

3-绘制这样的曲线是更好的机制吗? (我测试QCustomPlot和Qwt&gt;但不太好!)

这是我的ecg.txt文件 感谢。

2 个答案:

答案 0 :(得分:0)

我找到了解决方案: 我不得不为QWidget更新方法设置边界矩形。此函数采用矩形并仅更新其中的像素。这是我对Widget类的新实现。主要功能不需要改变:

% the data (with even more categories):
yesno = categorical(randi(4,1250,1),1:4,{'no','yes','maybe','don''t know'});
race = categorical(randi(5,1250,1),1:5,{'Asian','Black','BHispanic','White','WHispanic'});
% convert everything to numeric:
yn = double(yesno); 
rac = double(race);
% caluculate all frequencies:
data = accumarray([rac yn],1);
% get the categories names:
races = categories(race);   
answers = categories(yesno);
% plotting:
bar(data,0.4,'stacked');
ax = gca;
ax.XTickLabel = races; % set the x-axis ticks to the race names
legend(answers) % add a legend for the colors
colormap(lines(numel(answers))) % use pretier colors
ylabel('YES/NO')% set the y-axis lable
% some other minor fixes:
box off
ax.YGrid = 'on';

答案 1 :(得分:0)

您可以使用精彩的绘图库 - JOIN