xylosper's notebook

검색 :
RSS 구독 : 글 / 댓글 / 트랙백 / 글+트랙백

Qt에 대하여 - 3. 위젯(Widget)

2008/03/26 17:43, 글쓴이 xylosper
전회에 QLabel을 위젯이라고 소개하였습니다.

그럼 위젯이란 무엇일까요?

쉽게 얘기하면 보통 우리가 '창(window)'이라고 하는 것들입니다.

MFC에서는 창이라고 하지만, Qt에서는 위젯이라는 이름이 쓰입니다.

일반적인 유저들은 창이라고하면 독립된 창 하나만을 생각하기 쉽습니다만, 그뿐만 아니라 창안의 버튼이라든가, 글쓰는 난이라든가, 콤보박스등도 모두 창입니다.

이글을 Qt에 대한 글이므로 되도록 창이란 용어보다는 위젯이라는 용어를 쓰고, 창이란 용어는 하나의 독립된 창을 나타낼때만 쓰도록 하겠습니다.

Qt에서 위젯들은 모두 QWidget이라는 클래스로부터 상속됩니다.

이 클래스는 MFC로 치면 CWnd같은 클래스로, 모든 위젯의 공통요소들이 정의되어있고, 필요한 이벤트처리 함수가 오버라이딩 가능하도록 정의되어있습니다.

QWidget 클래스의 생성자는 QWidget::QWidget(QWidget *parent = 0, Qt::WindowFlags f = 0) 과 같은 원형을 가지고 있으며, QWidget을 상속하는 대부분(아마 모든이라고 해도 될듯한데 전부 제가 확인한 것은 아니므로 대부분이라고 적습니다)의 위젯 클래스들도 최소한 이 두개의 인자를 가지고 있습니다.

첫번째 인자 parent는 부모 위젯을 지정해줍니다.

여기서 지정하는 '부모'란 클래스 상속관계에서의 부모클래스 자식클래스가 아닌, 위젯간의 포함관계를 나타냅니다.

포함관계란, 어떤 위젯이 어떤 위젯의 내부에 존재하는 것을 가리킵니다.

예를 들어 어떤 위젯A을 띄웠더니 그안에 버튼이 있더라, 그럼 위젯 A는 버튼의 부모가 되는 것입니다.

디폴트 인자로 널포인터가 지정되어있는데, 만약 부모를 0으로 지정하면 최상위 윈도우, 즉 어떤 다른 위젯에도 포함되어있지 않은 독립된 창이 됩니다.

지난 Hello, world예제에서 QLabel 클래스의 인스턴스를 생성할때, label("Hello, world!")와 같이 생성자를 호출하였는데, 사실 이것도 뒤에 두개의 인자 parent와 f가 디폴트 인자 0, 0으로 지정되어 생략된 형태였습니다.

이경우 parent가 0이므로 label은 최상위 윈도우가 되어서 독립된 창으로 표시된 것입니다.

두번째 인자인 f는 위젯의 기본적인 (정확한 표현은 아니지만)스타일등을 지정합니다.

여기에는 Qt::Widget이나 Qt::Dialog, Qt::ToolTip 등과 같은 값과 |(BIT OR연산자)로 Qt::FramelessWindowHint나 Qt::WindowStaysOnTopHint같은 값이 결합되어서 들어갈 수 있는데, 아마 제 글에서 이부분값을 0이외의 값으로 지정할 일은 없을 듯합니다.

인자 f에 대한 좀더 자세한 설명

다음로 QWidget 클래스의 중요한 프로퍼티와 함수 몇가지를 소개하겠습니다.

1) size 관련

size()함수는 현재 위젯의 크기를 QSize 클래스에 담아서 반환해줍니다.

QSize는 이름 처럼 너비(width()) 높이(height())등 크기에 대한 정보를 가지고있는 클래스입니다.

너비만 알고 싶다면 width(), 높이만 알고 싶다면 height()를 바로 이용해도 됩니다.

크기를 변경하고 싶다면 resize(const QSize&)나, resize(int width, int height)를 이용하면됩니다.

이처럼 이름만 봐도 바로 뭐하는건지 알듯한 함수에 대해서는 앞으로 자세한 설명을 생략합니다.

sizeHint()는 위젯의 (일반적으로) 가장 적합한 크기를 반환해줍니다.

이는 위젯의 종류에 따라서 달라질수 있으므로 오버라이딩 가능하게 가상함수로 선언되어있구요.

또, Qt의 레이아웃 시스템은 이 sizeHint()에 근거하여 작동하며, adjustSize()라는 함수도 sizeHint()에 근거하여 적당한 크기로 위젯을 리사이즈해줍니다.

이외에도 minimumSizeHint, sizePolicy, minimumSize, maximumSize 등의 프로퍼티가 있습니다.

2) 위치 관련

pos()함수는 현재 위젯의 위치를 부모 클래스에 대한 상대적인 위치로 반환합니다.

만일 현재 위젯이 최상위 윈도우라면 화면내에서의 위치를 반환합니다.

상대적인 위치가 아닌, 화면내에서의 위치를 알고 싶으면 부모위젯의 mapToGlobal()함수로 글로벌 좌표로 변환해주면 됩니다.

위젯을 움직이려면, move(const QPoint &)나 move(int x, int y)와 같은 함수를 이용하면 됩니다.

3) 보이기/숨기기

show(), hide(), setVisible(bool), setHidden(bool) 와 같은 함수들이 있고 이름만 보면 아실 것입니다.

여기서 setVisible이나 setHidden처럼 같은 역할의 함수가 여러개가 존재하는 이유는 slot/signal을 위한 편의 제공입니다...만 아직 slot/signal을 설명하지 않았으므로 그냥 이런것도 있다는 것만 알아두시면 되겠습니다.

또 close()라는 함수도 있습니다. hide()는 단순히 보이지 않게만 하지만, close는 위젯을 닫아버리고, 만약 그것이 최상위 윈도우라면 어플리케이션은 종료됩니다.

4) 각종 이벤트 함수들

위젯은 GUI의 기본 요소인 만큼 각종 이벤트 함수들이 오버라이딩가능하도록 가상함수로 선언되어있습니다.

개인적으로 다음과 같은 이벤트 처리 함수를 자주 이용하게 되더군요.

keyPressEvent, mousePressEvent, mouseMoveEvent, resizeEvent, moveEvent

전부 이름만봐도 어떤 경우에 호출되는 함수인지 알듯하여 자세한 설명은 생략하고, 그외에도 많은 함수나 프로퍼티가 있으니, 나중에 예제에서 쓸일이 있으면 그때 설명하도록 하겠습니다.

위젯에 대해서는 이정도로 마치도록 하구요, 각종 위젯에 대한 소개는 몇가지 다른 위젯을 좀더 접해본후에 하도록 하겠습니다.


2008/03/26 17:43 2008/03/26 17:43

맨 위로