출처 : http://blog.naver.com/lobo_prix/220141339468

우선 OpenGL을 사용하기 전에, 프로젝트 설정이 되어야 한다.

 

QtCreator의 경우 .pro 파일에 QT += opengl 라고 추가해주고

VisualStudio의 경우 프로젝트 우클릭 - Qt Project Settings - Qt Modules - OpenGL 체크 해주면 된다.

 

QWidget 대신에 QWidget의 파생클래스인 QGLWidget을 상속받아서 작성한다.


'QT > OpenGL' 카테고리의 다른 글

OpenGL 화면 캡쳐해서 BMP 파일로 저장  (0) 2015.04.08
OpenGL에서 팝업(Popup) 메뉴 사용하기  (0) 2015.04.08
QT에서 OpenGL 사용하기  (0) 2015.04.03
Posted by 모래반지빵냐빵냐
,


OpenGL로 구현한 프로그램에 화면 캡쳐 기능이 필요해서 오동님 블로그를 참조해서 사용하다가

리눅스(Qt)에서도 사용하게 될 일이 있어서 수정한 거 올립니다.

확인 결과 MFC, Win32 API 에서 문제 없이 잘 동작하며 리눅스에의 확인은 제 친구가 했는 데

리눅스에서도 문제 없이 잘 동작한다고 하네요.(비트맵 관련 구조체가 없어서 구조체는 직접 추가했다고 함)


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
void ScreenCapture( const char *strFilePath )
{
    //비트맵 파일 처리를 위한 헤더 구조체
    BITMAPFILEHEADER    BMFH;
    BITMAPINFOHEADER    BMIH;
 
    int nWidth = 0;
    int nHeight = 0;
    unsigned long dwQuadrupleWidth = 0;     //LJH 추가, 가로 사이즈가 4의 배수가 아니라면 4의 배수로 만들어서 저장
 
    GLbyte *pPixelData = NULL;              //front buffer의 픽셀 값들을 얻어 오기 위한 버퍼의 포인터
 
#ifdef WIN32
    //윈도우의 클라이언트 영역 좌표
    RECT ImageRect;
    GetClientRect( *m_hWndCopy, &ImageRect );          
 
    //이미지 영역 좌표를 이용하여 실제 이미지의 사이즈를 계산
    nWidth  = ImageRect.right - ImageRect.left;     //윈도우 버전의 경우 사이즈 변경이 되므로 그때그때 조사
    nHeight = ImageRect.bottom - ImageRect.top;
 
#else
    nWidth  = 1024;     //(나의 경우)리눅스에서의 경우 해상도 고정이므로 그 값을 입력
    nHeight = 768;
 
#endif
 
    //4의 배수인지 아닌지 확인해서 4의 배수가 아니라면 4의 배수로 맞춰준다.
    dwQuadrupleWidth = ( nWidth % 4 ) ? ( ( nWidth ) + ( 4 - ( nWidth % 4 ) ) ) : ( nWidth );
 
    //비트맵 파일 헤더 처리
    BMFH.bfType  = 0x4D42;      //B(42)와 M(4D)에 해당하는 ASCII 값을 넣어준다.
    //바이트 단위로 전체파일 크기
    BMFH.bfSize  = sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER ) + ( dwQuadrupleWidth * 3 * nHeight );
    //영상 데이터 위치까지의 거리
    BMFH.bfOffBits = sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER );
 
    //비트맵 인포 헤더 처리
    BMIH.biSize             = sizeof( BITMAPINFOHEADER );       //이 구조체의 크기
    BMIH.biWidth            = nWidth;                           //픽셀 단위로 영상의 폭
    BMIH.biHeight           = nHeight;                          //영상의 높이
    BMIH.biPlanes           = 1;                                //비트 플레인 수(항상 1)
    BMIH.biBitCount         = 24;                               //픽셀당 비트수(컬러, 흑백 구별)
    BMIH.biCompression      = BI_RGB;                           //압축 유무
    BMIH.biSizeImage        = dwQuadrupleWidth * 3 * nHeight;   //영상의 크기
    BMIH.biXPelsPerMeter    = 0;                                //가로 해상도
    BMIH.biYPelsPerMeter    = 0;                                //세로 해상도
    BMIH.biClrUsed          = 0;                                //실제 사용 색상수
    BMIH.biClrImportant     = 0;                                //중요한 색상 인덱스
 
    pPixelData = new GLbyte[ dwQuadrupleWidth * 3 * nHeight ];  //LJH 수정
 
    //프런트 버퍼로 부터 픽셀 정보들을 얻어온다.
    glReadPixels(
        0, 0,                   //캡처할 영역의 좌측상단 좌표
        nWidth, nHeight,        //캡처할 영역의 크기
        GL_BGR,                 //캡처한 이미지의 픽셀 포맷
        GL_UNSIGNED_BYTE,       //캡처한 이미지의 데이터 포맷
        pPixelData              //캡처한 이미지의 정보를 담아둘 버퍼 포인터
        );
 
    {//저장 부분
        FILE *outFile = fopen( strFilePath, "wb" );
        if( outFile == NULL )
        {
            //에러 처리
            //printf( "에러" );
            //fclose( outFile );
        }
 
        fwrite( &BMFH, sizeof( char ), sizeof(BITMAPFILEHEADER), outFile );         //파일 헤더 쓰기
        fwrite( &BMIH, sizeof( char ), sizeof(BITMAPINFOHEADER), outFile );         //인포 헤더 쓰기
        fwrite( pPixelData, sizeof( unsigned char ), BMIH.biSizeImage, outFile );   //glReadPixels로 읽은 데이터 쓰기
 
        fclose( outFile );  //파일 닫기
    }
 
    if ( pPixelData != NULL )
    {
        delete pPixelData;
    }
}

아래는 위의 함수로 저장한 bmp파일들입니다.



'QT > OpenGL' 카테고리의 다른 글

Qt프로젝트에 OpenGL 사용하기  (0) 2015.04.13
OpenGL에서 팝업(Popup) 메뉴 사용하기  (0) 2015.04.08
QT에서 OpenGL 사용하기  (0) 2015.04.03
Posted by 모래반지빵냐빵냐
,

뭐 어려운건 없다..


생성자에서든 어디서  메뉴를 생성 해 준다.

그리고   

mouseReleaseEvent(QMouseEvent*)를 오버라이딩을 해서 사용한다.


예)

01.MyWidget::MyWidget()
02.{
03......
04.//메뉴 생성
05.QMenu menu = new QMenu(this);
06...
07.....  메뉴 추가
08...
09.////////
10.......
11.}
12. 
13.void MyWidget::mouseReleaseEvent(QMouseEvent* e)
14.{
15.if(  e->button() == Qt::RightButton )
16.{
17.menu->popup(e->pos());
18.}
19.}



위와 같이 처리 하면된다..


사용된 스샷




'QT > OpenGL' 카테고리의 다른 글

Qt프로젝트에 OpenGL 사용하기  (0) 2015.04.13
OpenGL 화면 캡쳐해서 BMP 파일로 저장  (0) 2015.04.08
QT에서 OpenGL 사용하기  (0) 2015.04.03
Posted by 모래반지빵냐빵냐
,

출처 : http://guimong.tistory.com/trackback/37

QtInOpengl.zip

QT 응용프로그램에서 OpenGl를 사용하기 위해서는 QtOpenGL과 OpenGL 라이브러리에 링크를 해야 합니다.

라이브러리와 링크하기 위해서는 프로젝트 파일에 QT+= opengl 를 추가해주어야 합니다.

[test.pro]

사용자 삽입 이미지









QGLWidget을 이용하면 표준 OpenGl 함수를 그대로 이용할 수 있습니다.
[test.h]

사용자 삽입 이미지






























protected에 선언된 paintGL()는 위젯이 그려질때마다 호출되는 paint()이벤트를 재정의 한것이고, mousePressEvent(), mouseMoveEvent()는 각각 마우스를 눌렀을때와 움직였을때를 재정의한 것입니다.

private에 선언된 함수와 변수들은 실제로 OpelGl를 그리기 위한 함수와 변수들입니다.
자세한 코드는 첨부파일을 받으셔서 보시기 바랍니다.
[결과]

사용자 삽입 이미지










Posted by 모래반지빵냐빵냐
,