-- Contents --
    [*] 라즈베리파이 OS x64 설치하기 : https://makeutil.tistory.com/136
    [*] QT5 설치하기 : https://makeutil.tistory.com/138
    [*] QT5 Webengine 설치 : https://makeutil.tistory.com/166
     
    000. Prologue : https://makeutil.tistory.com/168
    001. HelloWorld Project : https://makeutil.tistory.com/169 
    002. HelloWorld 프로젝트 구경하기 : https://makeutil.tistory.com/171

    003. BasicTextWidget : https://makeutil.tistory.com/173

    004. BasicTextWidget : 내용 둘러보기 <현재>

    005. LayoutExample : https://makeutil.tistory.com/175

    006. Radiobutton Example : https://makeutil.tistory.com/177

    007. CheckboxExample : https://makeutil.tistory.com/178 

    ------------------

     

      하루 이틀  쉬니까 몸이좀 회복이 된것 같다.  

     

      BasickTextWidget은 기본적인 위젯을 이용한 프로그래밍의 기본적인 내용이된다. 물론, 내용상 속성이나 이런부분은 아직 하지 않았지만 그런 부분들은 이후에 컨텐츠가 진행되면서 내부에 추가추가 해서 넣고 설명하면 되니까 말이다. 어쨋든 간단하지만 아주 기본적인 텍스트 위젯을 만들어 보았고, 이제 세부 내용을 확인하도록 하자. 

     

      앞서 생성한 BasicTextWidget 프로젝트의 구성파일중 사용자가 직접 만든 클래스는 Mainwindow 클래스이며, 관련 파일은  mainwindow.cpp, mainwindow.h, mainwindow.ui이다. 프로그램이 빌드되어 실행되면, main.cpp가 mainwindow 클래스를 시작하게 되고, mainclass에 있는 생성자를 실행하면서 화면에 UI가 표시된다. 

     

     

    1. mainwindow.ui

      화면에 출력될 위젯들을 배치하여 디자인한 ui파일이다. 앞서 텍스트 에디터로 열어보면 xml로 구성되어 있음을 확인할 수 있다. mainwindow 클래스는 이 리소스를 처리할 수 있도록 ui라는 객체를 이용해서 접근할 수 있게된다. 따라서, mainwindow에서는 ui->leName->settext()와 같이 해당 객체의 멤버에 접근이 가능하다. 

     

    객체명과 출력되는 텍스트를 수정 (이전 리소스 재활용)

     

    2. mainwindow.h

      mainwindow 클래스를 정의한 파일이다. 따라서 내부의 내용은 mainwindow.cpp의 클래스 구조가 정의되어있다. 

     

     

    3. mainwindow.cpp

      독자 여러분들이 생성한 mainwindow 클래스가 동작을 위해서 구현된 소스파일이다.  

    디자인에 사용된 Widget 타입

    1) 생성자

      아래는 생성자의 내용이다. 이는 mainwindow 클래스가 실행될 때 자동으로 실행되며, ui를 통해서 leName에 해당하는 위젯의 글자를 Unknown으로 표시하도록 설정한다. 그리고 pbClen(pushbutton)의 텍스트도 Clear로 설정한다.

     

      그다음 QObject:connect()는 이벤트와 처리되는 매서드를 연결하는데 사용된다. 아래의 두줄은 QObject 클래스에 구현되어있는 메소드로 mainwindow.h에 보면 QObject가 선언되어있음을 확인할 수 있다. QObject는 CPP과 별개로 QT에서 지원하는 여러가지 처리를 위해서 사용된다. 따라서 독자가 추가적인 다이얼로그등을 만드는데 QT의 요소가 사용된다면, 헤더에 QObject를 넣어주어야 한다. 

     

      그리고 동일한 메서드 이름으로 인한 오용사고를 하지 않으려면 connect()의 첫줄처럼 네임스페이스(Name Space)를 같이 표기하는 것이 좋지만,  그럴일이 없다면 아래와 같이 네임스페이스는 생략 가능하다.  

     

          ui->leName->setText("Unknown");
          ui->pbClean->setText("Clear");

          QObject::connect(ui->pbClean, SIGNAL(clicked()), this, SLOT(slotClearText()));
          connect(ui->pbInput, SIGNAL(clicked()), this, SLOT(slotSetText()));

     

      위의 connect()에 대해서 확인해보면, 처음인자는 이벤트를 발생시킬 대상, 다음은 발생되는 이벤트의 정의, 그리고 SLOT은 지정된 이벤트가 발생될 때 처리될 매소드를 지정한다. 따라서 첫번째 connect의 경우 푸쉬버튼인 pbClean이 클릭(Clicked)되면 slotSetText() 메소드를 실행하라는 의미가 된다. 따라서 독자들은 다음의 2가지 작업을 추가하면 된다. 

     

    (1) mainwindow.h에 이벤트 처리될 메소드를 등록

      위의 예시에 따르면 2개의 slot에 포함되는 매소드가 필요하므로 헤더에 다음과 같은 구문을 추가하여야 한다. 우선 connect에서 이용되어야 하는 매소드 이므로 접근권한과 slots:라고 선언한 다음 아래에 메소드를 선언한다. 

     

      public slots:
           void slotClearText(void);
           void slotSetText(void);

     

    (2) mainwindow.cpp에 해당 메소드를 구현한다. 

        아래와 같이 이벤트 발생시 처리될 내용을 추가하여야 한다. 

    void mainwindow::slotClearText(void)
    {
        // ...  내용생략
    }

    void mainwondow::slotSetText(void)
    {
       // ... 내용생략
    }

     

    2. 이벤트 처리를 위한 메서드 

      이벤트 처리를 위한 메서드는 다음과 같이 구현되어있음을 알 수 있다. 

    1) setClearText()는 TextEdit 클래스의 내부 메서드인 clear()를 호출하여 내용을 초기화(삭제)한다.

    2) slotSetText()는 문자열을 위한 QString myStr에 leText의 text()를 호출하므로서 사용자 이름을 넣을 수 있도록 만든 LineEdit에 있는 문자열을 반환하여 myStr에 넣는다. 그리고 이름을 가져온 myStr에 추가 문자열을 붙혀서 저장한다.

    3) 최종 저장된 문자열 myStr을 TextEdit인 teMemo의 setText()를 통해 화면에 출력한다. 

     

    void MainWindow::slotClearText(void)
    {
          ui->teMemo->clear();
    }

    void MainWindow::slotSetText(void)
    {
        QString myStr;
        myStr=ui->leName->text();
        myStr+=". Welcome to QT5 world.\nThis is simple example.\nmakeutil.tistory.com";
        ui->teMemo->setText(myStr);
    }

      

     

    3. 소멸자

      직접 입력하지 않고 자동으로 생성된 내용 그대로이다. 다만 이후 독자들이 어떠한 데이터 처리를 위해서 new를 이용하여 동적할당한 메모리가 있다면, 소멸자에서 delete로 처리해주어야 하며, 일반적으로 프로그램을 종료하면 메모리에서 제거 되므로 처리하지 않고 생략하기도 한다. 다만, 지속적이거나 반복적으로 완전 메모리의 초기화가 힘든 프로그램을 작성하게 된다면, 언젠가는 메모리 부족 메시지를 만나게 될 수도 있다. 그나마 최근 라즈베리파이나 PC의 경우 메모리가 워낙에 커서 만나는데 까지 시간이 상당히 소요될 수 있어서 간과될 수 있는 부분이므로 웬만하면 해주자. 

    void MainWindow::slotClearText(void)
    {
          ui->teMemo->clear();
    }

    void MainWindow::slotSetText(void)
    {
        QString myStr;
        myStr=ui->leName->text();
        myStr+=". Welcome to QT5 world.\nThis is simple example.\nmakeutil.tistory.com";
        ui->teMemo->setText(myStr);
    }

     

    4. 동작확인

      소스 내용으로 다음과 같은 처리를 예상할 수 있다.

    1) 프로그램 시작

      프로그램이 실행되면 이름입력 칸(leName)에는 Unknown으로 표시되고, 맨 아래는 Clear라는 버튼과 Input 버튼이 그리고 두개의 버튼 위에는 긴 문자열을 출력하기 위한 칸(teMemo)가 표시된다.

     

    2) Input 버튼 클릭

      이름을 입력하고 Input 버튼을 클릭하면 중간의 칸(teMemo)에 이름과 추가적인 문장이 출력된다. 

     

    3) Clear 버튼 클릭

       출력된 문자열이 사라진다.

     

     

      간단하게 코딩을 해보았는데 어떠한가? 물론 아직까지 특정 클래스에 있는 메소드에 대해서 알지 못하고 하고 있어서 갑갑하기는 할지도 모르겠지만 MFC이건 QT이건 보통 동작에 따라 클래스 내부의 메소드 이름이 만들어져 있어, 개발자가 하고자하는 동작에 대한 영단어를 넣으면 대부분 해당 동작에 대한 메소드가 표시된다. 그리고 메소드에 마우스를 올려대거나 자동입력시 화면에 메소드의 원형이 표시되어 해당 내용을 참조하여 코딩하고, 잘 모르는 경우 검색을 통해서 웬만하면 해결되므로 경험을 통해서 배우도록 하자. 

     

      위젯과 관련되어서 궁금한 독자는 QT5 Widget Class 문서를 확인하면, 다양한 위젯에 대한 정보를 사전에 확인하고 필요한 위젯을 통해서 독자스스로 만들고자 하는 소프트웨어를 개발할 수 있다. 이후 내용부터는 단일 게시물에 하나씩 필요한 내용만 추가하도록 하겠다. 

     

     

     

    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기