컴퓨터 공학/Qt

[ Qt 프로그래밍 ] Qwt에서 컬러맵 만들기

혼새미로 2015. 11. 26. 23:37
반응형


colorMap.zip


Qwt에서 간단하게 컬러맵을 만들어보도록 하겠습니다.

<이게 컬러맵 입니다>

 

Qt Creator에서 프로젝트를 하나 생성합니다. 이건 전에 언급했으니 넘어가겠습니다.

프로젝트를 보면 확장자명이 pro인 파일이 있습니다. 더블클릭해주세요.

 

오른쪽과 같은 코드가 뜨는데 빨간색 박스를 입력해주세요. Qwt 라이브러리를 사용하겠다는 표시입니다.

 

Qt 클래스 생성이 처음이니 이부분도 차근차근 설명해드리겠습니다.

 

 

그리고 프로젝트 루트폴더를 오른쪽 클릭- add New 를 클릭합니다.

 

 

그러면 다음과 같이 창이 뜨는데 이대로 Choose를 클릭해주세요.

 

 

클래스 네임에 colormap으로 입력한 후 next를 누르고 finish를 눌러 클래스를 생성합니다.

 

Colored By Color Scripter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#ifndef COLORMAP_H
#define COLORMAP_H
 
#include <QWidget>
 
class QwtScaleWidget;
class QHBoxLayout;
 
class colormap : public QWidget
{
public:
    colormap();
    ~colormap();
 
    void setRange(double absMin,double absMax,double curMin,double curMax);
 
private:
    QwtScaleWidget* rightAxis;
    QHBoxLayout* layout;
};
 
 
 
#endif // COLORMAP_H
 

 

이 코드에서 setRange는 컬러맵의 범위를 지정하는 함수입니다.

absMin은 절대 최소값, absMax는 절대 최대값, curMin은 현재 최소값, curMax는 현재 최대값입니다.

예를 들면, 원래 컬래맵의 범위가 0부터 100인데, 지금 내가 30부터 60까지의 범위만 확대해서 보고싶다고 한다면,

absMin=0, absMax=100, curMin=30, curMax=60 을 입력하면 됩니다.

 

Colored By Color Scripter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "colormap.h"
#include <qwt_color_map.h>
#include <qwt_plot_spectrogram.h>
#include <qwt_plot_layout.h>
#include <qwt_plot_magnifier.h>
#include <qwt_scale_widget.h>
#include <QHBoxLayout>
 
class ColorMap: public QwtLinearColorMap  //컬러맵 색상지정
{
public:
    ColorMap():
        QwtLinearColorMap( Qt::darkBlue, Qt::darkRed )
    {
        addColorStop( 0.2, Qt::blue );
        addColorStop( 0.4, Qt::cyan );
        addColorStop( 0.6, Qt::yellow );
        addColorStop( 0.8, Qt::red );
    }
};
 
colormap::colormap()
{
    QwtInterval zInterval;
    zInterval.setInterval(0.0,100.0); //눈금위젯에 절대 범위 지정
 
 
    rightAxis = new QwtScaleWidget(); //눈금 위젯
    rightAxis->setColorBarEnabled( true );
    rightAxis->setColorBarWidth( 40 );
    rightAxis->setAlignment(QwtScaleDraw::RightScale);
    rightAxis->setColorMap( zInterval, new ColorMap() );
 
    QList<double> majorTicks;
    for(int i=0;i<11;i++)
    {
        majorTicks.push_back(10.0*i);
    }
 
    QwtScaleDiv sdv; //눈금위젯에 보고자 하는 범위 지정
    sdv.setInterval(0.0,100.0);
    sdv.setTicks(2,majorTicks);
    rightAxis->setScaleDiv(sdv);
 
 
    layout=new QHBoxLayout(); //레이아웃에 눈금위젯을 넣음
    layout->setMargin(0);
    layout->setSpacing(0);
    setLayout(layout);
    layout->addWidget(rightAxis);
 
    setStyleSheet("QWdiget {background:transparent;border:none;}");
}
 
colormap::~colormap()
{
    delete rightAxis;
    delete layout;
 
void colormap::setRange(double absMin, double absMax, double curMin, double curMax) //범위지정 함수
{
    if(absMin>absMax||absMin>curMin||absMin>curMax) //값이 잘못입력되었을 경우 나감
        return;
    if(absMax<curMin||absMax<curMax)//값이 잘못입력되었을 경우 나감
        return;
    if(curMin>curMax)//값이 잘못입력되었을 경우 나감
        return;
 
    QwtInterval zInterval; //컬러맵 전체 길이
    zInterval.setInterval(absMin,absMax,QwtInterval::IncludeBorders);
    rightAxis->setColorMap(zInterval,new ColorMap());
 
    double interval=(curMax-curMin)/10.0; //눈금 10개 표현을 위해 최대값과 최소값의 차이를 10등분함
 
    QList<double> majorTicks;
    for(int i=0;i<11;i++)
    {
        majorTicks.push_back(curMin+interval*i); //10등분한 값을 차례대로 삽입
    }
 
    QwtScaleDiv sdv;
    sdv.setInterval(((curMin-absMin)/(absMax-absMin))*100.0+absMin,((curMax-absMin)/(absMax-absMin))*100.0+absMin);//확대한 최소값과 최대값 넣음
    sdv.setTicks(2,majorTicks); //눈금값을 넣음
    rightAxis->setScaleDiv(sdv); //축위젯에 값을 넣음
}
 
 

컬러맵 클래스의 정의 코드입니다.

코드꽤 기니 주석을 참고하시면 될 듯합니다.

 

제가 올린 첨부파일을 실행하면 다음과 같은 위젯이 실행됩니다.

 

 

처음에는 absMin=curMin, absMax=curMax 로 값을 입력하니 원본값이 나타납니다.

만약 여기서 curMin=30, curMax=60으로 입력하면 어떻게 될까요?

 

 

다음과 같이 나타납니다.

이상으로 설명을 마치겠습니다.

앞으로 이전에 설명한 부분은 스킵하도록 하겠습니다.

 

 

 

반응형