connect( &renderTimer, &QTimer::timeout, [=](){onTimerUpdate();} );


Posted by 모래반지빵냐빵냐
,

Qt를 이용하여 실행파일을 만들었다면 이제 배포를 해야 하는 데 shared library를 사용하여 개발을 했다면 관련 dll을 함께 배포하여야 한다.


상용버전을 구매하였다면 static build 해서 이런 문제를 간단히 해결하겠지만 그렇지 않다면 다음 내용을 참고 해 보자.




Dependency Walker를 이용하면 이 프로그램이 의존하는 dll들의 목록을 살펴볼 수 있다.

dll 트리구조에서 빨간 아이콘은 시스템 dll이기 때문에 패스하고 회색의 dll 들을 Qt dll이 들어있는 폴더에서 찾아

(본인의 경우 C:\Qt\Qt5.4.1\5.4\mingw491_32\) 해당 dll들을 복사해 온다.


근데 이렇게 해도 실행이 안되는 데 플랫폼 플러그인인 qwindows.dll 을 찾기 때문이다.


이 dll은 특이하게 실행파일과 같은 경로에 복사해도 오류를 발생시키는 데 이유는 platforms 폴더를 만들어서 넣어놔야 하기 때문이다. 아마도 실행 시 기본으로 이 폴더를 찾는 듯 하다. (소스를 수정하면 찾는 폴더를 바꿀 수 있을지도...)


참고로 core, gui 를 사용하는 Qt 프로그램을 MinGW(MSVC용이 아님) release로 빌드했을 때 필요한 dll들은 다음과 같다.

Qt5Core.dll

Qt5Gui.dll

Qt5Widgets.dll

icudt53.dll

icuin53.dll

icuuc53.dll

libgcc_s_dw2-1.dll

libstdc++-6.dll

libwinpthread-1.dll

platforms/qwindows.dll


마지막으로 위 과정을 한방에 자동으로 해주는 프로그램이 준비되어 있는데 windeployqt.exe란 프로그램이다.


지금 사용하는 컴퓨터의 환경이 꼬여서 windeployqt를 쓸 수 없어 수동으로 배포파일들을 구성했는데 고생하지 말고 위 프로그램을 쓰도록 하자. ^^


정적빌드하시는 분들에겐 필요가 없을 수도 있습니다만..
Qt를 설치하면 빌드에 관련된 툴이 있는 bin디렉토리가 있습니다. 이 안에 보면 windeployqt.exe가 있습니다. 
(예를들어 Qt.5.3.1 MinGW버전같은경우 C:/Qt/5.3/mingw482_32/bin)
이것은 작업한 실행화일의 디펜던시를 체크해서 필요한 화일들을 쉽게 복사해주는 프로그램인데요..
사용하는 법을 간단히 설명드리자면,
디렉토리를 생성해서 작업한 실행화일을 그곳에 복사한 후.. 대충 c:\qtdeploy\myapp.exe 이렇게 위치시켜보죠
Qt설치시 '시작'메뉴에 생성 되어있는 명령행프롬프트(반드시!)를 실행시킨 후
'c:\qtdeploy>c:\qt\5.3\mingw482_32\bin\windeployqt.exe myapp.exe' 해주면
myapp.exe에 필요한 모든 화일들이 c:\qtdeploy 디렉토리 안에 복사됩니다.
제가 아직은 NSIS에만 익숙한고로 이 방법이 상당히 편하네요 ^^

Posted by 모래반지빵냐빵냐
,

5. QFile

QT/Tutorials 2015. 4. 16. 13:46
QFile은 파일을 읽고 쓰는 인터페이스를 제공해준다. 

바이너리 파일이나 텍스트 파일을 읽고쓰게 해주며 QTextStream 이나 QDataStream과 사용되기도한다.


파일이름을 생성자에 넣어서 생성하기도하고 setFileName()을 써서 언제든지 파일이름을 지정해줄수도 있다.


'/' 이기호로 파일을 분류한다 .\<- 요거 아님


exists()로 파일이 인스턴스안에 존재하는지 체크 할수 있고 remove()로 지울수 있음


QtextStream은 8-bit 데이터를 16-bit Unicode QString으로 변환하는 역활을 한다.


QTextstream에 파일을 쓰기 위해선 <<() operator를 사용하면 된다.

요렇게 실행하면 "QFile Tutorial" 이라고 뜬단다. 아직안해봄




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

MainWindow and ImageViewer using Creator - Part A  (0) 2015.04.15
4. Main Window and Action  (0) 2015.04.14
3. Q_OBJECT Macro  (0) 2015.04.14
2. Signals and Slots  (0) 2015.04.14
1. HelloWorld  (0) 2015.04.14
Posted by 모래반지빵냐빵냐
,

QT) QMessageBox

QT/Basics 2015. 4. 15. 13:26

QT에서 MessageBox를 구현하려면 다음과 같은 방법을 사용하여야 한다.

#include <QMessageBox>

QMessageBox::warning(this, tr("Title"), tr("Message"), Buttons);

QMessageBox::question(this, tr("Title"), tr("Message"), Buttons);

QMessageBox::information(this, tr("Title"), tr("Message"), Buttons);

QMessageBox::critical(this, tr("Title"), tr("Message"), Buttons);

각각의 항목에 따른 아이콘들이 출력 되게 되어 있다. 

또한, Button은 다음과 같이 구성되어 있다.

QMessageBox::Ok   [OK 버튼]

QMessageBox::Cancel   [Cancel 버튼]   값 : 2

QMessageBox::Yes   [Yes 버튼]    값 : 3

QMessageBox::No   [No 버튼]    값 : 4

QMessageBox::Abort   [Abort 버튼]   값 : 5

QMessageBox::Retry   [Retry 버튼]   값 : 6

QMessageBox::Ignore   [Ignore 버튼]   값 : 7

QMessageBox::YesAll   [Yes to All 버튼]   값 : 8

QMessageBox::NoAll   [No to All 버튼]   값 : 9




Posted by 모래반지빵냐빵냐
,

출처 : http://god10276.tistory.com/entry/QT%EB%A1%9C-Serial-%ED%86%B5%EC%8B%A0-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-1


QT로 Serial 통신을 구현하려고 한다.

앞서 기본적으로 QT Creator 를 이용하여 Form을 생성하는 방법과 Button Event 등 Event 함수 등을 설정하는 방법 등에 대해서 기술하였다. 이번에는 실제 Serial 통신은 어떤 식으로 구현하는지 알아보자.

먼저 Window와 다르게 Linux는 /dev/ttyS0 -> COM1 , /dev/ttyS1 -> COM2 .... 이런 식으로 구성되고, USB to Serial 같은 경우에는 /dev/ttyUSB0 이런식으로 구분되기 때문에 따로따로 기술해 주어야 한다. 그래서 다음과 같이 정의했다.



#define DEVICE01 "/dev/ttyS0"
#define DEVICE02 "/dev/ttyS1"
#define DEVICE03 "/dev/ttyS2"
#define DEVICE04 "/dev/ttyUSB0"
#define DEVICE05 "/dev/ttyUSB1"



이런 식으로 정의하여서 사용자가 선택한 Device 장비로 Setting 될 수 있도록 하였다.

또한, BAUDRATE 같은 경우에는 <asm/termbits.h>에 정의되어 있는데 이것은 <termios.h>에 include 된다. 그러므로, <termios.h> Header File 만 Include 해 주면 된다. 

역시 편리하게 하기 위해 다음과 같은 방법으로 정의해 두었다.

#define BAUDRATE1200     B1200
#define BAUDRATE2400     B2400
#define BAUDRATE4800     B4800
#define BAUDRATE9600     B9600
#define BAUDRATE14400    B14400
#define BAUDRATE19200    B19200
#define BAUDRATE38400    B38400
#define BAUDRATE56000    B56000
#define BAUDRATE57600    B57600
#define BAUDRATE115200   B115200

기본적으로 Serial 통신을 위해 추가해 준 Header File은 다음과 같다.

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>



이제 본격적인 UI 구성으로 들어가 보자.





그냥 단순하게, Terminal 창 만을 나타낼 수 있도록 구성하였다. 앞부분에서 COM Port를 설정하고 뒷 부분에서 BAUDRATE를 설정한 후에 Connect를 하면 정상적으로 Board와 통신할 수 있게 된다. 해당 UI를 포함한 클래스의 Private member로 다음과 같은 항목들을 추가해 주었다.

    QSocketNotifier *notRsRead;
    int fd;
    char buf[BUFF_SIZE];


QSocketNotifier는 <QSocketNotifier>라는 Header를 추가해 주어야 한다. 이것에 대한 자세한 설명은 추후에 기술하도록 하겠다.

또한, QSocketNotifier에 의해 동작될 Event 함수도 public slots에 정의해 주었다. 

public slots:
    void setEvent();

// pushButton 사용자 정의 함수
private slots:
       void on_connectButton_clicked();

void MainWindow::on_connectButton_clicked()
{
    /*
        #define DEVICE01 "/dev/ttyS0"
        #define DEVICE02 "/dev/ttyS1"
        #define DEVICE03 "/dev/ttyS2"
        #define DEVICE04 "/dev/ttyUSB0"
        #define DEVICE05 "/dev/ttyUSB1"

        #define BAUDRATE1200     B1200
        #define BAUDRATE2400     B2400
        #define BAUDRATE3800     B4800
        #define BAUDRATE9600     B9600
        #define BAUDRATE14400    B14400
        #define BAUDRATE19200    B19200
        #define BAUDRATE38400    B38400
        #define BAUDRATE56000    B56000
        #define BAUDRATE57600    B57600
        #define BAUDRATE115200   B115200
    */

    struct termios newtio;
    int res;

    QString temp_port, port;
    QString temp_baudrate, baudrate;

    temp_port = ui->portBox->currentText();

    if(temp_port == "ttyS0")
    {
        fd = open(DEVICE01, O_RDWR | O_NOCTTY | O_NONBLOCK);
    }
    else if(temp_port == "ttyS1")
    {
        fd = open(DEVICE02, O_RDWR | O_NOCTTY | O_NONBLOCK);
    }
    else if(temp_port == "ttyS2")
    {
        fd = open(DEVICE03, O_RDWR | O_NOCTTY | O_NONBLOCK);
    }
    else if(temp_port == "ttyUSB0")
    {
        fd = open(DEVICE04, O_RDWR | O_NOCTTY | O_NONBLOCK);
    }
    else
    {
        fd = open(DEVICE05, O_RDWR | O_NOCTTY | O_NONBLOCK);
    }

    memset(&newtio, 0, sizeof(newtio));

    temp_baudrate = ui->baudrateBox->currentText();

    if(temp_baudrate == "1200")
        newtio.c_cflag = BAUDRATE1200;
    else if(temp_baudrate == "2400")
        newtio.c_cflag = BAUDRATE2400;
    else if(temp_baudrate == "4800")
        newtio.c_cflag = BAUDRATE4800;
    else if(temp_baudrate == "9600")
        newtio.c_cflag = BAUDRATE9600;
    else if(temp_baudrate == "19200")
        newtio.c_cflag = BAUDRATE19200;
    else if(temp_baudrate == "38400")
        newtio.c_cflag = BAUDRATE38400;
    else if(temp_baudrate == "57600")
        newtio.c_cflag = BAUDRATE57600;
    else if(temp_baudrate == "115200")
        newtio.c_cflag = BAUDRATE115200;

    newtio.c_cflag |= CS8;
    newtio.c_cflag |= CLOCAL | CREAD;
    newtio.c_iflag = IGNPAR;
    newtio.c_oflag = 0;
    newtio.c_lflag = 0;

    newtio.c_cc[VINTR]    = 0;     /* Ctrl-c */
    newtio.c_cc[VQUIT]    = 0;     /* Ctrl-\ */
    newtio.c_cc[VERASE]   = 0;     /* del */
    newtio.c_cc[VKILL]    = 0;     /* @ */
    newtio.c_cc[VEOF]     = 4;     /* Ctrl-d */
    newtio.c_cc[VTIME]    = 0;     /* inter-character timer unused */
    newtio.c_cc[VMIN]     = 1;     /* blocking read until 1 character arrives */
    newtio.c_cc[VSWTC]    = 0;     /* '\0' */
    newtio.c_cc[VSTART]   = 0;     /* Ctrl-q */
    newtio.c_cc[VSTOP]    = 0;     /* Ctrl-s */
    newtio.c_cc[VSUSP]    = 0;     /* Ctrl-z */
    newtio.c_cc[VEOL]     = 0;     /* '\0' */
    newtio.c_cc[VREPRINT] = 0;     /* Ctrl-r */
    newtio.c_cc[VDISCARD] = 0;     /* Ctrl-u */
    newtio.c_cc[VWERASE]  = 0;     /* Ctrl-w */
    newtio.c_cc[VLNEXT]   = 0;     /* Ctrl-v */
    newtio.c_cc[VEOL2]    = 0;     /* '\0' */


    tcflush(fd, TCIFLUSH);
    tcsetattr(fd, TCSANOW, &newtio);

    notRsRead = new QSocketNotifier(fd, QSocketNotifier::Read, this);
    connect(notRsRead, SIGNAL(activated(int)), this, SLOT(setEvent()));

}

void MainWindow::setEvent()
{
    int szRead;
    szRead = read(fd, buf, BUFF_SIZE);
    buf[szRead] = '\0';
    ui->textEdit->insertPlainText(buf);
    ui->textEdit->moveCursor(QTextCursor::End);
}


이게 실제 구현부이다. open을 통해 Com port를 열어 주고, BAUDRATE 설정을 통해 통신 속도를 설정해 준다. 그리고 QSocketNotifier로 Message가 오면 setEvent 함수가 동작할 수 있도록 구현하였다. 자세한 내용은 Source를 조금 읽어보면 쉽게 확인할 수 있을것이다.

여기서 중요한 부분은 

struct termios newtio;

이부분인데, 따로 정의하지 않아도 Header File안에 정의되어 있으므로 사용할 수 있다. 이 부분을 설정해주고 사용하여야 정상적인 통신이 가능하다.

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

Hello World를 띄우자.  (0) 2015.04.08
QT에서 이미지 출력하는 방법  (0) 2015.04.03
Qt에서 OpenCV 사용하기  (0) 2015.03.30
Posted by 모래반지빵냐빵냐
,

QT tr() 다국어 지원

QT/Basics 2015. 4. 15. 11:32

Qt는 언어를 바꾸기위해 소스코드를 바꾸지 않아도 되도록 다국어 지원을 한다.

   . Qt는 data를 다룰때 unicode string 을 사용한다. (QString QStringlist QChar)

   . Qt는 런타임에 어플리케이션 스트링을 자동적으로 읽어올 수 있는 기반시스템을 제공한다.

   . 또한 Qt Extended는 어플리케이션을 처음 시작할 때 언어 관련 파일을 자동적으로 로드한다.

 

다국어 지원을 위해서 tr() 함수를 사용한다.

   예) QString str(tr("Hello"));

   . QString tr(QString const&) 함수는 모든 클래스에 대해 moc에 의해 번역이 수행된다.

 

   . 추가적으로 comment 와 context 를 사용할 수 있다.

     ts 파일을 context(name, comment, extracomment, message) 등으로 구성되는데

     - context는 string scope 을 정의하는 기능(XML의 context로 생각하면 됨)

        생략 시 클래스 이름(Q_OBJECT 매크로가 정의된 QObject 의 class name)

        두개의 문장이나 구를 구분하는데 사용됨  

        즉, 같은 문장이라도 context가 다르면 2개를 번역을 해주어야 함.      

     - comment는 string이 뜻이 애매모호할 때 부가적인 설명을 붙이는 기능이다.

        QString str(tr("Hello", "this is comment"));

     - message가 실제 데이터 내용인데 source(원본) 과 translation으로 구성된다.

 

     .ts 파일의 내부를 보는데 위 내용을 알면 도움이 될것이다.

     ts : transltion source

     qm : qt message

 

Qt Extended 는 번역을 위해 몇가지 툴을 제공하는데 lupdate와 lrelease이다.

    lupdate : 소스로 부터 tr 함수의 string 파일로 부터 .ts 파일을 만든다.

    lrelease : 업데이트된 .ts 파일을 바이너리 파일인 .qm 파일로 만든다.

                  qm파일은 어플리케이션이 시작할 때 로딩되어 다국어를 읽을 수 있게 한다.

    Qt Linguist : .ts 파일을 그래픽 적으로 편집할 수 있게 하는 툴이다.

                     번역 상태가 Unfinished (번역안됨), Obsolete(이미 사용되어지지 않음, 회색으로 표시)

                     Finished (번역 끝남, 화면에 녹색 체크표시) 3가지 상태가 존재한다.

 

Qt Extended 는 언어 파일 추출을 위해 두가지 make target를 제공한다.

    make lupdate : 언어에 따른 ts 파일 생성

    make lrelease : ts 파일을 qm 파일로 변환 하고 i18n/<lang>/<application name>.qm 으로 qm파일을 설치

 

변수에 tr을 사용할 때 QT_TR_NOOP 또는 QT_TRANSLATE_NOOP 매크로 사용

static const char* str[] = {

   QT_TR_NOOP("String 1"),

   QT_TR_NOOP("String 2"),

   QT_TR_NOOP("String 3"),

   QT_TR_NOOP("String 4"),

}

 

QT_TRANSLATE_NOOP는

QT_TRANSLATE_NOOP("Context", "String 1")

와 같이 context를 사용할 수 있다.

 

 

TS 파일 내부 예

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS><TS version="1.1" language="ko_KR">
<defaultcodec></defaultcodec>
<context>
    <name>English (U.S.)</name>
    <message>
        <location filename="../../src/server/main/tr13494.cpp" line="2"/>
        <source>English (U.S.)</source>
        <translation></translation>
    </message>
</context>
<context>
    <name>Korean</name>
    <message>
        <location filename="../../src/server/main/tr13494.cpp" line="1"/>
        <source>Korean</source>
        <translation>?쒓뎅??/translation>
    </message>
</context>
</TS>


Posted by 모래반지빵냐빵냐
,

이번 장에선 이미지 뷰어를 만들어보겠음

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

5. QFile  (0) 2015.04.16
4. Main Window and Action  (0) 2015.04.14
3. Q_OBJECT Macro  (0) 2015.04.14
2. Signals and Slots  (0) 2015.04.14
1. HelloWorld  (0) 2015.04.14
Posted by 모래반지빵냐빵냐
,

이번엔 메인윈도우 클래스의 메뉴와툴바의 액션을 어떻게 설정하는지에 대해서 알아볼꺼임


Qt_QMainWindowArea_MenuBar_ToolBar_DockWindow_CentralWidget_StatusBar.png

음 위그림은 왜 대략적인 구조도인듯


QtGuiApplication.pngProjectManagement.png


아무튼 GUI 어플리케이션 프로젝트를 하나 만듬

ActionWindow.png

ui 부분에 가서 Type here에 file이라고 치고 

다음 하위 메뉴에 New Window 라고 치고 엔터!를 하면 아주 간단한 메뉴가 만들어짐

그런면 밑에 Action editor에 붉은색으로 메뉴가 하나 더 뜰것임 그것이 바로 New Window를 클릭했을때 어떻게 행동할 것인가를 처리하는 부분인듯 ?

DragAndDrop.png

이다음엔 Action editor에 있는 아이템을 끌어다가 붉은색 표시된 곳으로 드래그엔 드롭을 하면 메뉴바가 하나더 추가됨 

이렇게 하면 매뉴바의 2가지 버튼이 한가지액션을 공유하게 됨

RightMouseOnActionEditor.png

이제 액션 에디터에서 그림처리 Go to slot을 해서 이 메뉴들이 선택되었을때 어떤 액션을 취할 것인가를 지정해 주면됨GoToSlotTriggered.png

triggered()를 선택


그렇게 되면 위와 같은 소스코드가 자동적으로 생성되게 됨 이제 메뉴를 누르면 위의 함수가 실행되는것임

RunActionA.png 

그리고 실행해보면 이런창이 띄지만 별 기능은 없음

하지만 메뉴를 누를떄마다 

MainWindow::on_actionNew_Window_triggered()요 함수가 실행되고 있는거임



여기까지가 이제 메뉴바에 버튼을 추가하는 부분까지 이고 아래부터는 버튼을 눌렀을때 새로운 창을 띄우는 걸 해보겠음

가장 단순한 윈도우 창을 다이얼로그라고 부르는데 메인 다이얼로그가 새로운 다이얼 로그를 생성할때 메인 다이얼로그와 서브 다이얼로그가 동시에 제어가 되냐 안되냐에 따라서

Modal , Modaless로 나뉘게 됨. 모달은 메인이 제어가 안되고  modaless는 동시에 제어가 가능함.

고럼 모달부터 시작해보겠음. 

MyDialog.png 

일단 프로젝트에다가 오른 클릭해서 project->Add New->Qt->Qt Designer Form Class->Dialog without Buttons

FilesInTheProject.png 

추가하면 이렇게 다이얼로그 클래스가 추가가됨


그리고 mainwindow.cpp에 다음과같이 추가하면  새창띔 


Modaless 다이얼로그를 만들기 위해서 기존의 코드는 주석처리해주고


아래와 같이 코드를 바꿔보면 코드를 실행해서 버튼을 누르자마자 창이 꺼질거임 


이게 왜그러냐면 트리거 함수가 끝나면서 다이얼로그 메모리가 해제 되버리기때문임

고래서 요렇게

요렇게 하면 하면 Modaless 다이얼로그 생성됨

-끝-




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

5. QFile  (0) 2015.04.16
MainWindow and ImageViewer using Creator - Part A  (0) 2015.04.15
3. Q_OBJECT Macro  (0) 2015.04.14
2. Signals and Slots  (0) 2015.04.14
1. HelloWorld  (0) 2015.04.14
Posted by 모래반지빵냐빵냐
,

3. Q_OBJECT Macro

QT/Tutorials 2015. 4. 14. 13:50

Q_OBJECT 매크로에 대해서 알아보자




큐티 코딩을 하다보면 위와같은 큐 오브잭트 메크로가 클래스 정의 젤 윗부분에 보일 것이다.


Meta object system이나 시그널 실롯 등을 사용할때 꼭 명시를 해줘야 하는 부분이라고 설명이 되어있다


(Meta object system에 대해선 본문엔 the signals and slots mechanism, the run-time type information, and the dynamic property system 요렇게 나와있는데 뒤에 2개는 아직 QT를 다공부해보진않아서 모르겠다.)


실제로 매크로를 지우면 해당 시그널 슬롯이 동작을 안한다.


한마디로 큐티를 컴파일 하는 Meta object compiler(MOC)에게 이 클래스는 큐티기반의 클래스라는 것을 알려주는 역활을 하는것이다.


 큐티 기능을 쓰던 안쓰던 그냥 써놓으면 해가 되진않는듯하다 그냥 다 써놓으면 되는듯?


-끝- 


출처 : http://www.bogotobogo.com/Qt/Qt5_Q_OBJECT_Macro_Meta_Object.php 

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

MainWindow and ImageViewer using Creator - Part A  (0) 2015.04.15
4. Main Window and Action  (0) 2015.04.14
2. Signals and Slots  (0) 2015.04.14
1. HelloWorld  (0) 2015.04.14
QT 5.4.1 튜토리얼  (0) 2015.04.14
Posted by 모래반지빵냐빵냐
,

2. Signals and Slots

QT/Tutorials 2015. 4. 14. 11:30

이번 튜토리얼 에서는 윈도우 mfc에서의 메세지 핸들러 역활을 하는 signal slot 메커니즘에 대해서 설명함


QT widgets application으로 프로젝트를 하나만들고 forms 라는 폴더에 mainwindow.ui를 더블킬릭해보셈


CreatorDesign.png

그럼 요런 창이 뜸 MFC에 그것과 똑같은 역활을 함


Slider_ProgressBar.png

Horizontal Slider, Progress Bar 드래그 해서 붙여 넣고

GuiSlot.png

화살표에 보이는 거 누르고 

ConfigureConnection.png

위와 같이 두개 연결 시켜주고 실행 시키면

RunA.png

요렇게 슬라이더바랑 프로그래스바랑 같이 움직이는 프로그램 만들어짐


연결 해놓은거 떼버리고 


메인윈도우.cpp에 위와같이 코딩을 해넣어도 같은 효과로 작용함


이게 바로 QT의 signal and slot 시스템임


슬라이더바에서 움직였다는 시그널을 보내면 프로그래스바에서 그걸 캐치해서 바꿔줌 


-끝- 



이아니고 


http://www.bogotobogo.com/Qt/Qt5_SignalsSlotsGui.php에 밑에 Signal and slot 에 대한 설명이 영어로 되어있는데 읽어보면


좋음 


대략 내용은 기존에 프로그램에서는 callback 이란 것을 이용해서 이벤트 처리를 했다고 하는데


이 방법들은 type-safe ? 하지 않다고 함 그리고 call back 은 너무 강하게 연결성을 가지고 있다나 어쨋다나 아무튼 


시그널슬롯 짱짱맨이라는 말임




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

MainWindow and ImageViewer using Creator - Part A  (0) 2015.04.15
4. Main Window and Action  (0) 2015.04.14
3. Q_OBJECT Macro  (0) 2015.04.14
1. HelloWorld  (0) 2015.04.14
QT 5.4.1 튜토리얼  (0) 2015.04.14
Posted by 모래반지빵냐빵냐
,

1. HelloWorld

QT/Tutorials 2015. 4. 14. 11:18

뉴 프로젝트에서 콘솔 프로젝트 생성

NewProject.png 
위 그림은 5.3 버전이라 5.4랑 메뉴가 몇개 다를 거임 


당황하지 말고 Qt console application 선택하셈


ConsoleLocation.png 


이름정해주고 피니쉬 하면


#include <QCoreApplication>

 int main(int argc, char *argv[]) { 

QCoreApplication a(argc, argv); 

return a.exec();

 } 


요런 코드가 나올거심 Qcoreapplication은  콘솔 어플리케이션(non-GUI)의 이벤트 루프를 제공해준다고 함 

GUI 어플리케이션에서는 Qapplication 사용한다고함


Qcoreapplication 객체에서 exec()함수를 실행하면 이벤트 루프가 실행이 됨. 그럼 윈도우가 메세지를 날리면 받을 준비를 하는거임


ctl+r을 누르던가 녹색 삼각형 누르면 실행됨


하지만 아무것도 실행 되지는 않고 멈춰 있음 당연한거임 


프로그램을 실행을 실행하면 Qt 어플은 다음과 같은 순서로 컴파일됨

1. qmake 란게 먼저 .pro파일을 분석하고 makefile이란걸만듬

2. 만들어진 메이크파일을 프로그램이 빌드를 한다는군 



요것은 헬로우 월드를 띄우기 위한 코드 

방법이 어찌됫던  띄워진 모습

-끝-




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

MainWindow and ImageViewer using Creator - Part A  (0) 2015.04.15
4. Main Window and Action  (0) 2015.04.14
3. Q_OBJECT Macro  (0) 2015.04.14
2. Signals and Slots  (0) 2015.04.14
QT 5.4.1 튜토리얼  (0) 2015.04.14
Posted by 모래반지빵냐빵냐
,

QT 5.4.1 튜토리얼

QT/Tutorials 2015. 4. 14. 11:06

을 시작 해볼려고 생각중



qt 홈피에서 커뮤니티 버전으로 위에 껄 깔았어요 


그리고 http://www.bogotobogo.com/Qt/Qt5_TutorialHelloWorld.php 

여기 K Hong 님 자료를 이용해볼 생각임 

큐티에 대한 설명은 따로 하지않겠음 큐티를 찾는 분들은

왜 큐티가 필요한지 다들 알고 왔으리라 생각됨 

홈피에다 글쓰는 것도 첨이기도하고 컴공 출신이 아니여서 전문적이진 못할듯 많은 어려움이 있을지도 흠

바빠지면 못할수도 있음 하는데까지 최선을 다해봄!




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

MainWindow and ImageViewer using Creator - Part A  (0) 2015.04.15
4. Main Window and Action  (0) 2015.04.14
3. Q_OBJECT Macro  (0) 2015.04.14
2. Signals and Slots  (0) 2015.04.14
1. HelloWorld  (0) 2015.04.14
Posted by 모래반지빵냐빵냐
,

프로젝트에 .pro 파일에 아래와 같이 작성한다.

 

INCLUDEPATH += C:\Python34\include

QMAKE_LIBDIR += C:\Python34\libs

 


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

QT) QMessageBox  (0) 2015.04.15
QT tr() 다국어 지원  (0) 2015.04.15
Visual Studio 2013으로 Qt 사용하기  (0) 2015.04.13
Qt5 VS2010으로 사용하기 [출처] Qt5 VS2010으로 사용하기  (0) 2015.04.13
제목표시줄 없애기  (0) 2015.04.08
Posted by 모래반지빵냐빵냐
,

출처 : 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 모래반지빵냐빵냐
,

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


우선 Visual Studio 2013과 Qt5가 깔려있다는 가정을 하고 진행하겠다.

 

Visual Studio Add-in 1.2.3 for Qt5 를 다운받고 설치까지 한다.

 

Qt5 - Qt Options - Add

(메뉴바에 Qt5 항목이 새로 생겨있습니다) 

 

대화상자에 Name 은 Qt5.3.2 로 하고 Path는 C:\Qt\Qt5.3.2\5.3\msvc2013_64_opengl 로 설정해준다.

(버전이나 설치한 경로에 따라 다름, Name은 그냥 아무거나하고 Path 는 qmake.exe의 위치를 지정)

 

New Project - Qt Application 선택하고 프로젝트 만들고 빌드해보자.

 

32bit 사용자라면 빌드되겠지만 64bit 사용자라면 아래와 같은 오류를 보게된다.

fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'X86'

 

아래의 링크를 참고하여 설정을 64bit로 바꿔준다

http://blog.naver.com/lobo_prix/220125630463 

 

그 다음, Qt 설정에도 아래와 같이 명시해줘야한다.

프로젝트 우클릭 - Qt Project Settings - Version 을 Qt5.3.2로 선택

 

정상적으로 빌드와 실행이 됩니다.


Posted by 모래반지빵냐빵냐
,

출처 : http://cccob.blogspot.kr/2013/11/qt51-visual-studio-2012-add-in-windows.html


QT5.1 설치 및 Visual Studio 2012 Add-in 설치(Windows)

QT는 MFC와 같은 C++ 프레임워크이고 가장 장점으로는 크로스 플랫폼이라는 것이다.
예전부터 임베디드 환경에서 애용되고 있다. 오픈소스이지만 상용으로 사용할 때 라이센스가 다르므로 확인하고 넘어가도록 하자.


TrollTech -> nokia -> Digia 인수되었다.



환경
Windows7 Ultimate K  64bit
Visual Studio 2012  64bit ( update 3 )


1. http://qt-project.org/  에서 Qt 5.1.1 for Windows 64 - bit(VS 2012)를 다운받는다.

2. Visual Studio Add-in 1.2.2 for Qt5 를 다운받는다.

3. 1번에서 다운받은 파일을 설치한다.

4. 2번에서 다운받은 파일을 설치한다.

5. 내컴퓨터 -> 속성 -> 시스템 속성에서 환경변수를 추가한다.

6. 변수이름   QTDIR
    변수값      C:\Qt\Qt5.1.1\5.1.1\msvc2012_64;

7. Visual Studio를 켜서 QT5 탭으로 이동한다.

8. QT Option을 선택하여 QT Versions에 Add를 한다.

9. Version name    QT5.1
    Path  C:\Qt\Qt5.1.1\5.1.1\msvc2012_64

10. 설정해 주고 실행하면 LNK1112 에러가 난다. (x86과 x64가 다르다나..)

11. 프로젝트 속성 -> 링커 -> 고급 -> 대상컴퓨터 -> MachineX64로 바꾼다.

12. 그래도 실행하면 에러가 난다.(x64로 빌드가 되는지 확인한다)

13. 프로젝트 속성 -> Qt Project Settings 를 선택한다.

14. Properties탭에서 Version을 고른다.

15. 실행한다.


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

Include Path & Library Path 설정하기  (0) 2015.04.13
Visual Studio 2013으로 Qt 사용하기  (0) 2015.04.13
제목표시줄 없애기  (0) 2015.04.08
스타일쉬트(Style Sheet) 사용하기.  (0) 2015.04.08
사용자 정의 클래스.  (0) 2015.04.08
Posted by 모래반지빵냐빵냐
,

Qt4 Window버전

1.QMainWindow 생성자에서

MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent, Qt::FramelessWindowHint),
    ui(new Ui::MainWindow)
{
}

2. X11 용으로 

QWidget::setWindowFlags(Qt::Window|Qt::FramelessWindowHint); 
showFullScreen(); 
를 적용하여 프레임 없는 풀스크린 윈도우를 꾸몄습니다. 
Embeded 도 가능할듯 하네요.
  


3. 처음 위젯을 선언할때

korail_info_server::korail_info_server(QWidget *parent) 
    : QWidget(parent , Qt::FramelessWindowHint)

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 모래반지빵냐빵냐
,

ui 에디터나 아니면 

맴버 함수에서 setStyleSheet 를 이용하면 된다.

어쨌뜬 사용법은 

CSS하고 같다.

예를들어서

QWidget{
background-image:url("경로");
}
근데 위와 같은 식으로 하면

QWidget을 상속 받은 놈들이 다 적용이 되기때문에

그것보다는 

#objectName{
.....
}
이렇게 하면 상속받은 놈은 관계 없이 이놈만 스타일 쉬트가 적용된다.

위에 방법은 커뮤니티에서 봤다.  


Qt는 이런것을 쓰기에  디자인을 적용하는게 겁나게 편하다.. 


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

Qt5 VS2010으로 사용하기 [출처] Qt5 VS2010으로 사용하기  (0) 2015.04.13
제목표시줄 없애기  (0) 2015.04.08
사용자 정의 클래스.  (0) 2015.04.08
실행파일 아이콘 만들기  (0) 2015.04.08
QWidget  (0) 2015.04.08
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 모래반지빵냐빵냐
,

전에 있는거들은.. 죄다 ..

Qt에서 제공되는 클래스를 사용했다..

이번에는 내가 원하는 클래스를 만들어 본다.

접기

#ifndef USERCLASS_H
#define USERCLASS_H

#include <QtGui/QWidget>
#include "ui_userclass.h"

class UserClass : public QWidget
{
    Q_OBJECT

public:
    UserClass(QWidget *parent = 0);
    ~UserClass();

private:

};

#endif // USERCLASS_H

///////////////////////////////////
userclass.cpp
#include "userclass.h"

UserClass::UserClass(QWidget *parent)
    : QWidget(parent)
{

}

UserClass::~UserClass()
{

}

/////////////////////////

main.cpp

#include <QtGui>
#include <QApplication>
#include "userclass.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    UserClass user;
    
    user.show();
    return a.exec();
}

실행 결과


접기


소스를 보면.. QWidget클래스를 상속을 받고 있다..

그리고 생성자와 소멸자가 있다. 
생서자의 경우는 QWidget* 를 매개변수로 이용한다.

그리고 보면 Q_OBJECT 라는 매크로가 있다.

요 메크로를 안적어놓으면 connect가 작동 안한다.

고로 시그널과 슬롯을 사용하길 원한다면 Q_OBJECT를 써 놓으면 된다.

그리고 Q_OBJECT를 안쓰면 컴파일 하고 폴더를 살펴보면  debug 폴더에 o 파일 밖에 없다.

하지만 Q_OBJECT를 사용하면 moc_클래스이름.cpp 파일이 생긴것을 볼 수 있다.

저 파일은 MOC(Meta Object Compiler)가 만들어 놓은 것이다.

자세한 것은 실험을 해보면 알 수 있다.

그리고 실행결과는 그냥 창 하나만 뜨고 만다.

이유야.. 뭘 추가한게 없기 때문이다.

그래서 이 창에다가 버튼을 한개 넣고 버튼을 클릭하면 메시지 박스가 나오는것을 할것이다.

접기

///////////////////////
#ifndef USERCLASS_H
#define USERCLASS_H

#include <QtGui/QWidget>
#include "ui_userclass.h"
#include <QPushButton>

class UserClass : public QWidget
{
    Q_OBJECT

public:
    UserClass(QWidget *parent = 0);
    ~UserClass();

public slots:
    void onClicked();
private:

    QPushButton* bt;
};

#endif // USERCLASS_H
/////////////////////////

userclass.cpp
#include "userclass.h"

UserClass::UserClass(QWidget *parent)
    : QWidget(parent)
{

    bt = new QPushButton(this);
    bt->setText("button");

    QObject::connect(bt,SIGNAL(clicked()),this,SLOT(onClicked()));

}

UserClass::~UserClass()
{

}

#include<QMessageBox>
void UserClass::onClicked()
{
    QMessageBox::about(0,"Button clicked","Click!!");
}

/////////////////
main.cpp 위와 동일

/////////////////
실행결과

접기


소스를 보면 음영을 한 부분을 주목하면 된다.

public slots: 라고 써있다. 이 밑에다가 쓰는 것들은 모두 슬롯이라는 의미이다.
signal 도 마찮가지로 public signal: 이라 사용한다.

위에 있는 방식을 토대로 Qt는 만들어지게 된다.

물론 이런식으로 만들지는 않는다. ui 편집기라는게 있어서 편하게 편집을 할 수 있다.

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

제목표시줄 없애기  (0) 2015.04.08
스타일쉬트(Style Sheet) 사용하기.  (0) 2015.04.08
실행파일 아이콘 만들기  (0) 2015.04.08
QWidget  (0) 2015.04.08
QT에서 Mouse를 Control 하는 방법  (0) 2015.04.03
Posted by 모래반지빵냐빵냐
,

말 그래도 http에 연결을 해서  받은 데이터를 화면에 뿌려 보는거다.

쉽게 말하자면  인터넷을 키고  원하는 사이트를 입력하면 그 사이트가 뜨는걸 볼 수 있다.

그 사이트를 보는걸 해보겟다는거다. 당연히 사용되는건 Qt 4.6 버젼이다.

-----------------------------------
http 연결에 쓰는 클래스..

QNetworkAccessManager          이 클래스는 연결하고 request 를 보내거나 하는 클래스이다.
QNetworkReply                         이 클래스는 request를 보냈을때 서버에서 보낸 걸 받는 클래스이다. 

위에 있는 클래스들은 api에 가면 자세하게 설명이 되어있기때문에.. api를 참조.. 
------------------------------------

소스 닫기

소스를 보면 더 쉽게 이해 될 수 있을것이다.

#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QSslError>

class htmlRead : public QWidget
{
    Q_OBJECT

public:
    htmlRead(QWidget *parent = 0);
    ~htmlRead();

public slots:
    //이 슬롯은 QNetworkReply에서 readyRead()라는 시그널이 발생할때 처리하는 메소드이다.
    void slotReadyRead();
    //이 슬롯은  QNetworkReply에서   error라는 시그널이 발생했을때 처리하는 메소드이다.      
    void slotError(QNetworkReply::NetworkError err);
    
    //이 슬롯은  QNetworkReply에서 ssl 에러 처리를 하는 메소드이다.
    void slotSslErrors(QList<QSslError> err);
    // 이 슬롯은 데이터가 다 전송되면 NetworkAccessManager에서 발생하는 시그널인 finished를 처리하는 메소드이다.
    void replyFinished(QNetworkReply* reply);

private:
    //ui에는 textBrowser를 적당하게 배치해놧다.
    Ui::htmlReadClass ui;

    QNetworkReply *reply;
    QByteArray data ;
};


/////////////////////////////////////////////////
// htmlread.cpp

#include "htmlread.h"

htmlRead::htmlRead(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);

     QNetworkAccessManager *manager = new QNetworkAccessManager(this);
     connect(manager, SIGNAL(finished(QNetworkReply*)),
             this, SLOT(replyFinished(QNetworkReply*)));
     
    //여기서 주의 할 점은 다른곳에서 get 메소드를 사용하면 readyRead() 시그널이 바로 발생하지 않는다.
    // 고로 사용할 때 주의를 해야한다. 즉 get()을 불러온 그 함수가 끝나야 readyRead()가 발생한다.

     reply =  manager->get(QNetworkRequest(QUrl("http://www.naver.com")));
     connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
     connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
             this, SLOT(slotError(QNetworkReply::NetworkError)));
     connect(reply, SIGNAL(sslErrors(QList<QSslError>)),
             this, SLOT(slotSslErrors(QList<QSslError>)));

}

htmlRead::~htmlRead()
{

}

void htmlRead::replyFinished(QNetworkReply* reply)
{
    QString string(data);

    ui.textBrowser->setHtml(string);

}
#include <qdebug.h>

void htmlRead::slotReadyRead()
{
    //reply객체에서 데이터를 읽어오는 메소드이다. 
    //readAll()의 경우는 모든 데이터를 한번에 뽑아오는 메소드이다. 
    // 그것 말고 도 많이 있다. read()도 있고 readLine()도 있다. 더 자세한것은 
    // QIODevice를 참조..
    data = reply->readAll();

}

void htmlRead::slotError(QNetworkReply::NetworkError err )
{

}

void htmlRead::slotSslErrors(QList<QSslError> err)
{

}


소스 닫기


실행결과 :




위에 소스를 보면 알 수 있다.



근데 문제는 해보면 제대로 안뜨는걸 볼 수 있다.

그건 어쩔 수 없다. 일반적인 사이트들은 html만 사용된게 아니라 그림에 자바스크립트,  플래시 기타등등이 사용되었기 때문에 이상하게 나와도 어떻게 할 방도가 없다. 제대로 나오게 하고 싶다면 webkit을 사용하는 수 밖에... 아니면 직접만들던가.

Posted by 모래반지빵냐빵냐
,

Qt로 프로그램을 만들고 나서 보면 아이콘이 xp에서 보면 도스 프로그램 아이콘 같이 나온다..


(나는 윈도우7을 쓰기때문에 이런식으로 나온다..)

그걸 바꿔보자..

각 운영체제 별로 다른데..

지금 나는 윈도우를 쓰고 있으므로 윈도우 용으로 소개를 하겠다..

여기 들어가면 자세하게 설명 되어있다.. 물론 영어로! 

http://qt.nokia.com/doc/4.6/appicon.html

그냥 텍스트 파일을 만든다..

그걸 편집하도록 하자..

aaa.txt를 메모장으로 연다..

IDI_ICON1      ICON      DISCARDABLE         "아이콘 이름.ico"

위에 처럼 적어 놓고 저장을 할때.. 이름.rc 로 저장한다.

아이콘은 반드시.. ico라는 확장자를 가져야한다.. 그림파일로 하면 안된다.. 

그림 파일이면 변환을 시켜서 ICO로 만들도록..

그리고 IDE로 들어가서..

pro 파일을 연다.

그리고 맨 아래에다가..

RC_FILE = 이름.rc

처럼 만든다..

그리고 qmake를 실행 해주고..

프로그램을 빌드하면 아이콘이 들어가 있는것을 볼 수 있다.



이렇게 바뀐다.

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

제목표시줄 없애기  (0) 2015.04.08
스타일쉬트(Style Sheet) 사용하기.  (0) 2015.04.08
사용자 정의 클래스.  (0) 2015.04.08
QWidget  (0) 2015.04.08
QT에서 Mouse를 Control 하는 방법  (0) 2015.04.03
Posted by 모래반지빵냐빵냐
,

강좌랄것도 없음.

그냥 대충 설명하는 정도로 하겠음  .

Qt를 사용하기 위해서는 최소한 C++ 
문법은 알아야할것이다.
어쨌든 모든 프로그램들 보면 항상 "Hello World"  가 나오는걸 한다.

고로 나도 하겠음.

그리고 IDE는  이클립스던 Qt Creator 아무거나 키고 하면 됨.

이클립스의 경우 file에서 new -> Qt Gui Project를 선택 후.. next를 계속 누른다.



그리고 Project Explorer 에서 main.cpp를 찾는다. 



이후 부터는 위에꺼는 설명 안함.


소스..

#include <QtGui>
#include <QApplication>

#include <QLabel>                             //QLabel이라는걸 include 한다.
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QLabel 
t("<b>Hello World</b>");         // 이렇게 처 넣는다.

    t.show();                                        //show 메소드를 호출.

    return a.exec();
}


실행 결과



위에와 같이 나온다.  Qt는 Label도 혼자서 창으로 띄울 수 있다.  
MFC도 할 수야 있겠지만 Qt 처럼 간단하게는 안됀다. 워낙 구려서..
그리고 HTML 테크가 먹힌다. Html 을 안다면 한번 해보도록 한다.

Qt는 main 부터 시작을 한다. 물론 내부적으로는 winmain이지만 프로그래머가 편하게 이런식으로 만들어져있다.
QApplication 이 클래스를 안써주면 동작을 안한다. 
나도 어떻게 돌아가는건지는 모르겠으나  QApplication이 각종 라이브러리 정보를 읽어오고 WinMain을 실행하는 것 같다. 넘어가서..

show 메소드 .. 메소드 이름이 아주 직관적이다.   보여줘라 라는 뜻으로 사용하면 결과와 같이
창이 뜬다.    이클립스 같은걸로 보면  인라인 함수로 setVisible(true) 해가지고 만들어 졌다.
setVisible 처럼 쓰기 귀찮은거 보다 show가 편한다.

그리고 이런걸 처음 해본 사람이 아니라면 그냥 http://qt.nokia.com/doc/4.6/index.html 여기 들어가서 하면 충분히 할 수 있다.

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

QT로 Serial 통신 구현하기 - 1  (0) 2015.04.15
QT에서 이미지 출력하는 방법  (0) 2015.04.03
Qt에서 OpenCV 사용하기  (0) 2015.03.30
Posted by 모래반지빵냐빵냐
,

QWidget

QT/Basics 2015. 4. 8. 15:22

QWidget 이란..

간단하게 실행을 해보면 안다.

#include <QtGui>
#include <QApplication>

#include <QWidget>

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

///////////////////
    QWidget widget;

    widget.show();
//////////////////////
    return a.exec();
}
실행결과 



실행하면 그냥 창 한개 뜬다.

이게 QWidget의 역활이다. 창을 띄우는 역활을 한다. 물론 이거 하나만으로는 잘 안쓰인다.

이 Widget안에다가 여러가지 컴포넌트를 넣고 한다.

그리고 많은 Qt 클래스들이 이 클래스를 상속받아서 쓰고 있다.

전에 한 QLabel 도 QWidget을 상속 받았기 때문에 독자적으로 띄울 수 있는것이다.

밑에 있는 주소에 가면  QWidget에 대해 잘 설명 되어있다.. 그 중에 몇개만 설명한다.

http://qt.nokia.com/doc/4.6/qwidget.html

void addAction ( QAction * action )   
요 메소드는 액션을 추가하는 메소드이다.. 액션이란게 여러가지 있는데.. 메뉴를 추가 한다던가 
숏컷, 그러니까  단축키를 추가한다던가 여러가지를 추가 할 수있다.

void setGeometry ( int x, int y, int w, int h )
위치를 설정하는 메소드이다.. x 와 y는 위치 w 는 넓이  h 높이이다.

void setWindowTitle(const QString s)
이 메소드는  창의 제목을 설정하는 메소드이다.

void resize(int w, int h)
이 메소드는 창의 크기를 조절 한다.


끗.. 별거 없다.. 도큐먼트 보면 영어로 잘 설명 되어있으니까  거기 가서 보면 된다.

=============================
이전꺼..
1. Hello World

저작자 표시 비영리 동일 조건 변경 허락


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

제목표시줄 없애기  (0) 2015.04.08
스타일쉬트(Style Sheet) 사용하기.  (0) 2015.04.08
사용자 정의 클래스.  (0) 2015.04.08
실행파일 아이콘 만들기  (0) 2015.04.08
QT에서 Mouse를 Control 하는 방법  (0) 2015.04.03
Posted by 모래반지빵냐빵냐
,

출처 : http://ko11011.tistory.com/trackback/8


QT에서 이미지를 로드하여 화면에 출력하는 방법을 알아보자

 

순서

QImage로 이미지를 불러온다. -> QPixmap에 옮긴다. -> QLabel에서 QPixmap를 불러와서 화면에 출력한다.

 

코드를 보며 설명하겠다.

 

 

#include <QImage>              //QImage를 사용하기 위한 라이브러리

#include <QPixmap>             //QPixmap를 사용하기 위한 라이브러리

#include <QLabel>              //QLabel를 사용하기 위한 라이브러리

#include <QMessageBox>         //QMessageBox를 사용하기 위한 라이브러리

 

//해당 함수로 이미지를 로드한다. ( 직접 제작한 함수이다.)

void MainWindow::imgload()

{

    QImage *Img = new QImage();       //이미지를 로드하기 위한 QImage 선언

    QPixmap *buffer = new QPixmap();  //버퍼로 사용할 QPixmap 선언

 

    if(Img->load(":/img/1.jpg"))      //이미지를 로드한다.

{

        *buffer = QPixmap::fromImage(*Img);   //이미지를 버퍼에 옮긴다.

        *buffer = buffer->scaled(Img->width(),Img->height()); //이미지 사이즈 조절

    }

    else // 이미지 로드 실패

{

        QMessageBox::about(0, QString::fromAscii("Image load Error"),QString::fromAscii    ("Image load Error"));

    }

 

    QLabel *lbView = new QLabel(this); //이미지를 화면에 출력할 QLabel 선언

    lbView->setPixmap(*buffer);       //버퍼에 있는 이미지를 QLabel에 출력

    lbView->resize(buffer->width(),buffer->height()); //QLabel의 크기를 이미지 사이즈에 맞추어 조절한다.

    lbView->move(0,0);                //QLabel위치 조정

    lbView->show();                   //QLabel 를 보여준다.

}

 

 

 

 

변수는 총 3개 필요하다.

1) QImage         이미지를 불러올 때 이미지라는 것을 알기 위해 사용한다.

2) QPixmap        : QLabel에 이미지를 옮길 때 사용하는 중간 버퍼

3) QLabel          실제로 화면에 출력해주기 위한 Label

 

QImage load함수를 사용하여 이미지를 로드한다.

if(Img->load(":/img/1.jpg"))   //이미지를 로드한다.

 

 

bool QImage::load ( const QString & fileName, const char * format = 0 )

 

첫번째 인자 : 파일이름이 들어간다.

두번째 인자 : 파일의 포멧이 들어간다. (생략 가능하다.)

 

리턴값 : 이미지 로드가 성공시 TRUE을 리턴하고 실패시 FALSE를 리턴한다.

 

 

QPixmap static 함수를 사용하여 QImage 변수형을 QPixmap형식으로 전환하여 옮긴다.

 

*buffer = QPixmap::fromImage(*Img);

 

 

QPixmap QPixmap::fromImage ( const QImage & image, Qt::ImageConversionFlags flags = Qt::AutoColor ) [static]

 

첫번째 인자 : 변환할 QImage

두번째 인자 : Qt::ImageConversionFlags 설정 (기본값이 설정되어있어 변경하지 않았다자세한 내용은 필자도 모른다. Qt::ImageConversionFlags를 참고 )

 

 

 

QLabel setPixmap 함수를 이용하여 QPixmap에 옮긴 이미지를 QLabel에 출력한다.

 

lbView->setPixmap(*buffer);

 

 

Public Slots

        void    setPixmap ( const QPixmap & )

첫번째 인자 : 출력할 QPixmap

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

QT로 Serial 통신 구현하기 - 1  (0) 2015.04.15
Hello World를 띄우자.  (0) 2015.04.08
Qt에서 OpenCV 사용하기  (0) 2015.03.30
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 모래반지빵냐빵냐
,

출처 : http://ko11011.tistory.com/trackback/9


QT에서 Mouse Control 하는 방법

 

 QT에서 Main이 되는 Class  QWidget이다.

QWidget에서 virtual function으로 mouse control하기 위한 함수를 제공한다.

 

virtual void   mouseDoubleClickEvent ( QMouseEvent * event );

virtual void   mouseMoveEvent ( QMouseEvent * event );

virtual void   mousePressEvent ( QMouseEvent * event );

virtual void   mouseReleaseEvent ( QMouseEvent * event );

 

해당 함수를 재정의 (오버라이딩  overiding) 를 해서 사용하면 된다.

 

해당 함수에서 event->x()  event->y()로 현재 마우스의 좌표를 알 수가 있다.

마우스 좌표는 창의 좌측 상단을 기준으로 0, 0으로 되어있다.

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

제목표시줄 없애기  (0) 2015.04.08
스타일쉬트(Style Sheet) 사용하기.  (0) 2015.04.08
사용자 정의 클래스.  (0) 2015.04.08
실행파일 아이콘 만들기  (0) 2015.04.08
QWidget  (0) 2015.04.08
Posted by 모래반지빵냐빵냐
,

출처:http://blog.daum.net/goodgodgd/12


이번엔 Qt에서 opencv 설치하는 과정에 대해서 써보도록 하겠습니다.

이미 구글에 검색해보면 여러가지 비슷한 설치방법들이 나오는데요.. 제가 완결판을 만들어보겠습니다.


OpenCV 설치 방법을 간단 요약하자면

1. 다운받아서 설치한다.

2. CMake로 make 파일 만든다. (Qt 관련 설정 필요)

3. 빌드한다.

4. Qt 프로젝트 파일을 수정한다.

5. 코드에 #include <opencv2/opencv.hpp> 추가하고 OpenCV를 맘껏 쓴다.

비주얼 스튜디오를 사용하는 경우에는 직접 빌드할 필요가 없습니다. 이미 비주얼 스튜디오의 컴파일러로 빌드된 파일들을 설치시에 제공하기 때문이죠.

OpenCV코드를 직접 수정하거나 Qt같은 마이너 환경을 쓰는 경우엔 직접 빌드해야 합니다.

CMake는... 저도 아직 잘 모르겠어요. 저도 OpenCV 설치할 때만 CMake를 쓰는지라...ㅎ;;

CMake를 쓰는 이유는 (저도 잘은 모르지만) 비주얼 스튜디오 같은 통합개발환경(IDE) 없이 컴파일러만 가지고 빌드하려면 코드들 사이의 관계를 정의해주는 Makefile 이라는게 필요한데 코드가 많은 복잡한 프로젝트의 경우 Makefile을 직접 작성하기가 지랄맞게 어렵다고해서 그것보다 좀 더 쉬운 문법으로 CMakeLists.txt를 써주면 CMake 프로그램에서 알아서 Makefile을 만들어주겠다.... 는 거라네요. (그럼 애초에 Makefile을 만들기 쉽게하던가..;;)

암튼 OpenCV는 설치시 CMakeLists.txt를 제공하고 그래서 CMake로 빌드할 준비를 해야한다는 겁니다.


이제 본론 갑니다.


일단 OpenCV를 다운받아서 설치를 해야겠죠?

http://opencv.org/downloads.html

그런데 제가 해본 결과 3.0 버전은 Qt로 빌드가 잘 되지 않습니다. 그러니 일단 OpenCV 2.4.9 버전을 설치해주세요.

(3.0으로 Qt 잘 돌리시는 분 있음 댓글로 팁좀 주세요;;;)

저는 이미 구버전이 깔려있어서 헷갈리지 않게 C:\opencv_249 에 설치했습니다.

그리고 CMake도 설치해 주세요.

http://www.cmake.org/download/ 

윈도우라면 Binary distributions에 Windows (Win32 Installer) 이걸로 설치하는게 편할겁니다.


CMake를 실행하기 전에 먼저 시스템 환경변수를 설정해줘야 합니다.

이걸 안하면 아예 Configure부터 막힙니다;;

아래 그림대로 쭉 따라가세요.



저기서 저 Path란 변수에 Qt를 이용한 빌드에 필요한 경로를 추가해줍니다.

C:\Qt\5.3\mingw482_32\bin;C:\Qt\Tools\mingw482_32\bin;C:\Qt\Tools\QtCreator\bin;


처음에 설치 방법 소개했을때 말한 MinGW를 사용하는 것입니다.

절대 Path의 기존 경로들을 지운다거나 그런 실수는 하지 마세요;;; 위 경로를 추가!하는 겁니다.

시스템변수를 설정했으니 이제 CMake를 실행하는 것이... 아니고 일단 컴퓨터를 리부팅 해줘야 수정한 경로가 적용됩니다. Reboot!!


이제 진짜 CMake를 실행해서 다음과 같이 경로를 설정해 봅시다.

Where is the source code: 에는 OpenCV 설치 폴더에 들어있는 sources 폴더의 경로를 적어주면 되고

Where to build the binaries: 에는 빌드할 폴더를 지정합니다. sources 옆에 build라는 폴더는 이미 있기 때문에 다른 폴더 이름을 지정합니다.

Qt debug 모드에서 사용할 바이너리 파일을 만들기 위해 build_qt_debug란 이름을 붙였습니다. Release 모드로 쓸거라면 build_qt_release라고 했겠죠.

근데 debug 모드랑 release 모드랑 빌드를 따로해야 하냐구요? 맞습니다. 어떻게 하냐구요? 뒤에 나옵니다. 왜 그래야 하냐구요? 물론 공용으로 빌드해도 어느정도 돌아가긴 합니다.

그런데 몇가지 기능이 제대로 동작하지 않는것을 보고 저도 디버그 모드로 다시 빌드했습니다.

예를들면 imshow()로 이미지를 새 창에 띄우고 나서 똑같은 window name으로 다른 이미지를 imshow() 했는데 그림이 바뀌지 않더란 말입니다;;;


그리고 Configure를 누릅니다. 빌드 폴더가 없으면 만들겠냐고 물어보는데 당연히 Yes!

그러면 어떤 컴파일러로 OpenCV를 빌드할 것인지 아래와 같이 설정해줍니다.

Qt 설치시 MinGW를 선택하였으므로 Qt에서 설치해준 mingw 컴파일러를 지정합니다.


이제 Finish를 누르면 configure가 진행됩니다. 아까 환경변수를 수정하고 재부팅!까지 해주지 않았다면 여기서 바로 에러뜨고 막힙니다.

Configure가 약간 시간이 걸리는데 끝나고 나면 다음과 같은 화면이 뜹니다. 빨간색이 아니어도 에러만 안뜨면 괜찮습니다.


Configuring done 이라고 뜨지만 끝난것은 아닙니다. 여기가 핵심 비법이라고 할수 있는데요ㅋ

위에 search 창에 qt라고 검색해서 WITH 아래 WITH_QT를 체크해줍니다. WITH 옆에 화살표가 안보인다고 당황하지 마세요!

마음의 눈으로 화살표가 있을만한 왼쪽에 빈 공간을 눌러주면 아래 항목이 나옵니다.


또한 cmake로 검색해서 cmake 아래에 CMAKE_BUILD_TYPE에 Debug라고 씁니다. 그리고 Configure를 몇 번 더 눌러주세요.


Configure 다음은 Generate 입니다. 이건 한번만 실행하면 됩니다. 그럼 이렇게 빌드폴더에 갖가지 파일과 폴더.. 그리고 Makefile이 생겼음을 볼 수 있습니다.


이제 드뎌 진짜!! 빌드를 할 차례입니다.

윈도우키+R 로 "실행"을 실행시키고 cmd라고 쓰고 엔터!치면 콘솔창이 나옵니다. 그리고 아래와 같이 make 합니다.

>c:\opencv_249\opencv\build_qt_degub

>mingw32-make



그럼 한참동안 컴퓨터가 빌드하고 있을겁니다. 10분이상 걸릴테니 잠깐 딴짓을 해도 좋습니다.

그런데 제가 집컴에서는 빌드가 한방에 되는데 회사에서 하면 자꾸 중간에 멈춰서 진행이 안되고 다시 빌드하고 그런 것을 반복해야 했는데 왜 그런지는 모르겠습니다. 잘 되고 있나 한번씩 확인해주세요.

다 되고 나면 이런 화면이 뜰겁니다. 다음은 mingw32-make install 입니다. make install을 하면 빌드된 곳으로 소스코드까지 다 복사가 됩니다.


끝나면 결과는 이렇게...


이제 설치는 끝났습니다. 몇 가지 설정만 더 해주면 사용할 수 있습니다.

초반에 보였던대로 빌드해서 만든 opencv의 dll 파일들을 우리 프로젝트에 링크시킬려면 (즉 opencv를 사용하려면) 위에서 한대로 

시스템 속성 - 환경변수로 들어가서 Path에 다음 경로를 추가해야 합니다.

C:\opencv_249\opencv\build_qt_debug\bin


그리고 역시 재부팅을 해줍니다. 이걸 건너뛰고 프로그램을 실행하면 다음과 같은 메시지를 보며 한참을 머릴 쥐어뜯으며 구글을 헤메이게 될 것입니다.ㅎㅎ 

(절대 경험담 아님;;)


이제 드디어!! Qt를 켜봅시다.

QtOpenCVTest라는 Qt Widgets Application 프로젝트를 만들었습니다.


비주얼 스튜디오에서도 opencv를 사용할 때 프로젝트 속성에서 opencv 경로를 설정해줬듯이 Qt에서는 .pro 파일에서 경로를 지정합니다.

왼쪽 위에 QtOpenCVTest.pro 파일을 열어 다음 경로와  dll 파일들을 추가합니다. 아래 지정한 dll 파일들은 기본적인 것들이고 필요에 따라 빼거나 추가할 수 있습니다.

INCLUDEPATH += C:\opencv_249\opencv\build_qt_debug\install\include


LIBS += C:\opencv_249\opencv\build_qt_debug\bin\libopencv_calib3d249d.dll \
        C:\opencv_249\opencv\build_qt_debug\bin\libopencv_contrib249d.dll \
        C:\opencv_249\opencv\build_qt_debug\bin\libopencv_core249d.dll \
        C:\opencv_249\opencv\build_qt_debug\bin\libopencv_features2d249d.dll \
        C:\opencv_249\opencv\build_qt_debug\bin\libopencv_highgui249d.dll \
        C:\opencv_249\opencv\build_qt_debug\bin\libopencv_imgproc249d.dll \



반드시 프로젝트 파일을 수정한 후에는 Ctrl+S로 저장을 해줘야 효과가 나타납니다.

그리고 헤더 파일 mainwindow.h 에 opencv 헤더 파일을 인클루드합니다. 이후 예제를 위해 파일다이얼로그 클래스와 문자열 클래스도 추가합니다.

#include <opencv2/opencv.hpp>

#include <QFileDialog>

#include <QString>


이제 OpenCV를 쓸 수 있습니다. 위젯에 버튼하나 추가해서 버튼을 누르면 이미지 하나를 열어서 보여주는 예제를 만들겠습니다.

버튼하나 추가하고 우클릭 - Go to slot - clicked() 선택해서 연결함수를 생성합니다.


void MainWindow::on_pushButton_clicked()
{
    QString qsfileName = QFileDialog::getOpenFileName(this,
        tr("Open Image"), "../", tr("Image Files (*.png *.jpg *.bmp)"));
    cv::Mat image = cv::imread(qsfileName.toStdString());
    cv::imshow("Hello OpenCV", image);

}


파일 다이얼로그를 열어서 파일을 선택하고 그 파일을 열어서 보여주는 간단한 함수입니다. 파일명의 형태를 std::string으로 바꿔주기 위해 .toStdString() 함수가 들어갔습니다.

이제 실행해서 버튼을 누르고 이미지 파일을 열어봅시다. Voila!!


역시 비전 관련 예제는 레나가 나와야 제맛!!

여기까지 잘 따라오셨다면 축하합니다. 하지만 삽질은.. 이제부터 시작이겠죠?

별 내용도 아닌데 캡쳐로 도배를 했더니 페이지수만 많아졌네요;;

저도 이 과정을 완전히 이해한 것은 아니라 수정/태클/지적질 환영합니다.

그럼 다음 삽질때 봐요~

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

QT로 Serial 통신 구현하기 - 1  (0) 2015.04.15
Hello World를 띄우자.  (0) 2015.04.08
QT에서 이미지 출력하는 방법  (0) 2015.04.03
Posted by 모래반지빵냐빵냐
,