안녕하세요.

 

Project Cars 2 포스팅에서 말한대로 의자를 흔드는 모션 시뮬레이터를 만들기 위해,

현재 스텝 모터를 만지고 있고 소프트웨어 준비를 하고 있습니다.

 

2018/05/16 - [DIY/Project Cars 2] - Project Cars 2 SLI 완성!

 

 

무엇보다 차량의 서스펜션 값이 정말 궁금하더라구요.

그래서 그래프를 그려보기로 했습니다. 속도 그래프와 같이요.

그러면 풀 브레이킹을 할 때 앞으로 쏠리는 것이 보일 것이고, 기어 변속 충격도 눈으로 확인 할 수 있겠죠?

 

일단 자주 사용하는 Qt에서 그래프를 그려보도록 합니다.

정말 고맙게도 Qt에서 그래프를 그릴 수 있는 라이브러리는 오픈소스로 공개되어 있습니다.

 

기능이 막강한 만큼 사용법이 참 어려운데요,

라이브러리를 가져다가 메인 그래프 1개와 서브 그래프 4개를 같이 그리는 프로젝트를 올려보겠습니다.

 

이번 기회에 Git을 공부하고 있어요... 파일이 너무 많아서 여기에 올리는 것은 관리도 힘들 것 같고 복잡하겠죠.

제 Git 첫 프로젝트 주소는 https://github.com/LocoField/LocoGraph 입니다!

 

 

Start 버튼을 눌러 스레드를 시작하면 이렇게 그래프가 실시간으로 그려집니다.

마우스 드래그로 그래프 범위를 이동할 수도 있는데, 그래프 새로운 값을 그리는 중에는 자동으로 움직여서 의미 없을 것 같네요.

 

아직 버그가 많이 있을 수 있어요... 또한 데이터 저장을 포함한 다양한 기능이 있으면 좋겠군요.

계속 기능을 추가하여 개선해나가도록 하겠습니다.

 

Project Cars 2 데이터 뽑는 것은 branch를 따야겠네요.

그래프 기능 추가 안하고 프카 먼저 하고 싶은데...ㅋㅋㅋ

 

제 프로젝트를 포함하여 QCustomPlot 라이브러리 질문은 댓글로 달아주세요.

최대한 도와드리도록 하겠습니다!

 

 

참고 웹페이지:

[1] http://www.qcustomplot.com/

 

'코딩 > Qt' 카테고리의 다른 글

Qt Graph 그리기  (0) 2018.07.22
Qt PDF Viewer  (1) 2018.03.15

Qt는 메타데이터에서만 문제가 생기지 않는다면... 쉽고 빠르게 GUI 소프트웨어를 작성할 수 있는 프레임워크이죠!

소프트웨어 안에서 PDF 문서를 보여주고자 할 때도 쉽게 해결 할 수 있습니다.

 

PDF Viewer를 만들기 위한 클래스 생성 예제를 올려봅니다.

 

Qt로 작성된 poppler 라이브러리를 사용하였고, 이것은 XpdfReader 라이브러리를 기반으로 한다고 합니다.

저는 서브클래스를 만들어 확대/축소, 페이지 이동 기능만 추가하였습니다.

 

라이브러리는 https://poppler.freedesktop.org/ 에서 라이브러리를 다운받을 수 있습니다.

또는 아래에서 Visual Studio 2015 x64로 제가 빌드한 라이브러리를 다운받으실 수 있습니다.

 

poppler.zip

 

 

PDF 핸들링은 라이브러리에서 다 해주기 때문에 서브클래스는 많이 복잡하지 않습니다.

스케일 비율이 커지면 문서가 점점 짤릴텐데, 아직 마우스 드래그로 뷰를 움직이는 기능은 구현하지 않았습니다.

근데 마우스 드래그 처리가 귀찮을 뿐, Page::renderToImage 함수에서 x, y 파라미터에 값만 전달해주면 쉽게 구현할 수 있겠네요.

 

질문은 얼마든지 환영합니다.

그럼 뿅!

 

 

QDocumentWidget.h

 

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
#pragma once
 
#include <QWidget>
#include <QLabel>
#include <QImage>
#include <QWheelEvent>
 
#include <poppler-qt5.h>
 
 
class QDocumentWidget : public QLabel
{
    Q_OBJECT
 
public:
    QDocumentWidget(QWidget* pParent = NULL);
    ~QDocumentWidget();
 
protected:
    Poppler::Document* m_pDocument;
    Poppler::Page* m_pDocPage;
    int m_page;
    int m_scale; // pdf 문서 렌더링 크기. 단위는 %.
 
protected:
    void wheelEvent(QWheelEvent* event);
    void mouseDoubleClickEvent(QMouseEvent* event);
 
public:
    bool loadDocument(std::string path);
    bool setPage(int page);
    void showDocument();
    void closeDocument();
 
};
 
cs

 

 

 

QDocumentWidget.cpp

 

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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include "QDocumentWidget.h"
 
#include <QGuiApplication>
 
 
QDocumentWidget::QDocumentWidget(QWidget* pParent)
    : m_pDocument(nullptr)
    , m_pDocPage(nullptr)
    , m_page(0)
    , m_scale(150)
{
    setParent(pParent);
 
    setBackgroundRole(QPalette::Dark);
    setAlignment(Qt::AlignCenter);
    setAutoFillBackground(true);
    setScaledContents(false);
    setMouseTracking(true);
}
 
QDocumentWidget::~QDocumentWidget()
{
    closeDocument();
}
 
void QDocumentWidget::wheelEvent(QWheelEvent* event)
{
    Qt::KeyboardModifiers k = QGuiApplication::keyboardModifiers();
    if( k == Qt::ControlModifier )
    {
        if( event->angleDelta().y() < )
            m_scale = max(m_scale - 550);
        else
            m_scale = min(m_scale + 5500);
 
        showDocument();
    }
    else
    {
        if( event->angleDelta().y() > // 위로
            setPage(m_page - 1);
        else
            setPage(m_page + 1);
 
        showDocument();
    }
}
 
void QDocumentWidget::mouseDoubleClickEvent(QMouseEvent* event)
{
    if( event->button() == Qt::LeftButton )
    {
        m_scale = 100;
        showDocument();
    }
}
 
bool QDocumentWidget::loadDocument(std::string path)
{
    if( m_pDocument != nullptr )
        closeDocument();
 
    m_pDocument = Poppler::Document::load(path.c_str());
 
    if( m_pDocument == nullptr )
        return false;
 
    return setPage(m_page);
}
 
bool QDocumentWidget::setPage(int page)
{
    if( page < return false;
 
    if( m_pDocument )
    {
        int nPages = m_pDocument->numPages();
 
        if( page >= nPages )
            return false;
 
        m_page = page;
        m_pDocPage = m_pDocument->page(m_page);
        return m_pDocPage != nullptr;
    }
 
    return false;
}
 
void QDocumentWidget::showDocument()
{
    if!m_pDocPage )
        setPage(m_page);
 
    if( m_pDocPage )
    {
        QImage image = m_pDocPage->renderToImage(m_scale, m_scale);
        setPixmap(QPixmap::fromImage(image));
    }
}
 
void QDocumentWidget::closeDocument()
{
    if( m_pDocument != nullptr )
    {
        delete m_pDocPage;
        m_pDocPage = nullptr;
 
        delete m_pDocument;
        m_pDocument = nullptr;
    }
}
 
cs

 

 

참고 웹페이지:

[1] https://github.com/danigm/poppler

[2] http://www.xpdfreader.com/

 

'코딩 > Qt' 카테고리의 다른 글

Qt Graph 그리기  (0) 2018.07.22
Qt PDF Viewer  (1) 2018.03.15
  1. 2018.09.19 14:06

    비밀댓글입니다

+ Recent posts