It won't hurt to try

[C++/윈도우프로그래밍응용]31. Qt의 메인 윈도우 (2) 본문

C++/윈도우프로그래밍응용

[C++/윈도우프로그래밍응용]31. Qt의 메인 윈도우 (2)

yongki.doki 2021. 11. 22. 00:51

C++에 대한 Qt의 확장

GUI 프로그램은 실행 시의 효율성과 유연성 양쪽 모두 필요

표준 C++ 객체 모델은 객체 패러다임에 대해서 매우 효율적으로

런타임 자원을 지원하지만 일부 영역에서 정적 측면에서 유연성 부족

강력한 시그널/슬롯 구조

  • 상호 관계없는 객체 간의 통신 지원

객체 속성(Object Property)

  • 질의가 가능한 디자인 가능
    → metaObject()메소드와 QMetaObject 클래스

강력한 이벤트와 이벤트 필터

국제화를 위한 문자 번역

타이머(Timer)

  • 이벤트 구동 GUI에서 많은 작업(Task)을 간결한 처리가 가능하도록 동일 간격으로 동작

계층적인 객체 트리(Object Tree)

  • 객체 간의 상관관계 구성

QObject클래스

  • Qt에서의 대부분의 클래스는 표준 C++기능을 이용할 수 있도록 QObject클래스를 상속
  • 시그널과 슬롯을 구현하는 객체(위젯)들은 모두 QObject 클래스를 계승
  • 타이머와 관련된 메소드 제공
  • 디버그 관련 객체 정보에 관한 메소드도 제공
  • 문자 번역과 같은 국제화 관련 메소드를 제공
  • 이벤트와 관련된 메소드 제공
  • 객체의 구조와 관련된 메소드를 제공

사용자 정의 슬롯

사용자 정의 슬롯을 위한 3가지 조건

1. 부모 클래스는 QObject 클래스를 직/간접적으로 상속

2. 헤더파일(.h)에서 클래스의 정의 부분에 Q_OBJECT 지시어 필요

  • 메타 오브젝트 코드(moc)가 생성될 수 있도록 지정
  • qmake가 moc 컴파일러를 수행할 수 있도록 해줌

3. 클래스 내에 시그널과 슬롯을 선언

  • 슬롯 : 헤더파일(.h)에서 "접근 지정자 + slots:" 아래에 선언하고 소스코드(.cpp)에서 구현
  • 시그널 : "signals:" 아래에 선언
  • 시그널을 선언할 뿐 구현할 필요가 없음
    → moc 유틸리티가 메타 오브젝트 코드에 자동으로 구현

슬롯은 일반 함수와 같이 호출 가능

슬롯을 사용할 때는 일반적으로 void형의 반환형을 사용

widget.h

#include <QWidget>

// QObject를 직/간접적으로 상속받아야함
class Widget : public QWidget {

  // Q_OBJECT를 명시해줘야함
  Q_OBJECT

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

// 슬롯은 접근지정자+slots안에다가 구현했는가
public slots:
  void slotQuit();

}

 

사용자 정의 슬롯은 구현이 필요

widget.cpp

Widget::Widget(QWidget *parent) : QWidget(parent) {

  QLabel *label = new QLabel("<font color=blue>Hello Qt!</font>", this);
  label->setGeometry(10,50,75,35);
  
  connect(quit, SIGNAL(clicked()), this, SLOT(slotQuit()));
}

void Widget::slotQuit() {

  qDebug("slotQuit");
  qApp->quit();
}

moc(Meta Object Compiler)

시그널/슬롯은 C++에서 직접 지원하지 않는 기능

사용자 정의의 시그널/슬롯을 사용하는 소스코드를 컴파일 할 수 있도록 메타 오브젝트 코드를 생성

$ moc - o moc_widget.cpp widget.h

qmake 유틸리티

  • Qt의 프로젝트 파일과 makefile파일을 생성
  • 프로젝트 파일의 생성 : $ qmake -project widget.cpp
  • makefile의 생성 : $ qmake [ - makefile]

                              qmake -project                          qmake [-makefile]

Source code                    ->                    .pro                    ->                    makefile

 

Qt creator

  • Build 메뉴에서 Run qmake 항목
300x250
300x250
Comments