작업을 수행하는 데 필요한 메커니즘을 이해하는 데 도움이되는 빠른 예제를 설정했습니다.
데이터를 수신하여 도면을 위해 Widget
으로 전송하는 Listener
클래스로 구성됩니다.필자는 데이터를 무작위로 생성하여 타이머를 사용하여 일정한 간격으로 전송하도록 설정했지만 사용자의 경우에는 직렬 포트 데이터가됩니다.
플롯이 무엇인지 알고 싶으므로 paintEvent
을 사용하면 단일 점을 그릴 수 없습니다. 점 하나만 표시되고 점 데이터가 누적되지 않기 때문에 점으로 그릴 필요가 있습니다. 픽스맵은 paintEvent
에 표시됩니다.
class Widget : public QWidget {
Q_OBJECT
public:
Widget(QWidget *parent = 0) : QWidget(parent) {
resize(200, 200);
p = new QPixmap(200, 200);
}
protected:
void paintEvent(QPaintEvent *) {
QPainter painter(this);
painter.drawPixmap(0, 0, 200, 200, *p);
}
public slots:
void receiveData(int x, int y) {
QPainter painter(p);
painter.setBrush(Qt::black);
QPoint point(x, y);
painter.drawPoint(point);
data.append(point);
repaint();
}
private:
QPixmap *p;
QVector<QPoint> data;
};
class Listener : public QObject {
Q_OBJECT
public:
Listener(QObject *p = 0) : QObject(p) {
QTimer * t = new QTimer(this);
t->setInterval(200);
connect(t, SIGNAL(timeout()), this, SLOT(sendData()));
t->start();
}
signals:
void dataAvaiable(int, int);
public slots:
void sendData() {
emit dataAvaiable(qrand() % 200, qrand() % 200);
}
};
... 메인 :
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
Listener l;
QObject::connect(&l, SIGNAL(dataAvaiable(int,int)), &w, SLOT(receiveData(int,int)));
w.show();
return a.exec();
}
그래서 무슨 위젯에 전송마다 200 밀리 초를 생성하는 임의의 데이터이며, 여기에
은 위젯과 리스너 클래스입니다 여기서 pixmap에 추가되고 Widget
은 새 항목을 표시하도록 업데이트됩니다.
편집 : 포인트 (픽셀)가 얼마나 작은지를 고려하여 작은 원을 그릴 수 있습니다. 또한 데이터 값을 기준으로 점의 색상을 지정할 수 있으므로 그라디언트를 얻을 수 있습니다 (예 : 낮은 값은 초록색 일 수 있지만 높으면 높을수록 노란색으로 바뀌며 마지막으로 빨간색으로 변할 수 있음).
나중에 필요할 경우 수신 된 데이터를 QVector<QPoint>
에 추가하려면 receiveData
슬롯에서 수행 할 수 있습니다.
언급 할 가치가있는 또 다른 사항은 예제에서 모든 것이 0-200 범위의 데이터, 플롯 창에 있습니다. 매우 편리합니다. 현실에서는 그렇지 않을 것이므로 데이터를 플롯 크기에 매핑해야합니다. 플롯 크기는 위젯 크기에 따라 달라질 수 있습니다.
다음은 일반적으로 일부 범위의 값을 정규화하기 위해 사용하는 템플릿입니다. 요구 사항에 따라 약간 단순화 할 수 있습니다.
template <typename Source, typename Target>
Target normalize(Source s, Source max, Source min, Target floor, Target ceiling) {
return ((ceiling - floor) * (s - min)/(max - min) + floor);
}
Edit2가이 : 숫자 형태로 수신 된 모든 포인트를 저장하는 data
벡터를 추가했습니다.
위젯의 update() 메소드를 호출하고 paintEvent() 메소드 내부의 모든 것을 그립니다. – bkausbk