Qt에 대하여 - 3. 위젯(Widget)
2008/03/26 17:43전회에 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이외의 값으로 지정할 일은 없을 듯합니다.
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
전부 이름만봐도 어떤 경우에 호출되는 함수인지 알듯하여 자세한 설명은 생략하고, 그외에도 많은 함수나 프로퍼티가 있으니, 나중에 예제에서 쓸일이 있으면 그때 설명하도록 하겠습니다.
위젯에 대해서는 이정도로 마치도록 하구요, 각종 위젯에 대한 소개는 몇가지 다른 위젯을 좀더 접해본후에 하도록 하겠습니다.
그럼 위젯이란 무엇일까요?
쉽게 얘기하면 보통 우리가 '창(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
전부 이름만봐도 어떤 경우에 호출되는 함수인지 알듯하여 자세한 설명은 생략하고, 그외에도 많은 함수나 프로퍼티가 있으니, 나중에 예제에서 쓸일이 있으면 그때 설명하도록 하겠습니다.
위젯에 대해서는 이정도로 마치도록 하구요, 각종 위젯에 대한 소개는 몇가지 다른 위젯을 좀더 접해본후에 하도록 하겠습니다.
Trackback URL : http://xylosper.net/trackback/109
-
위젯 개발의 화두 'width'
Tracked from 위젯박사 쏭군의 열정이야기 2008/11/20 23:15 Delete위젯 개발시 width(너비)문제는 어디에서 출발하는가?위젯을 개발할 때, 빠질 수 없는 화두가 바로 'width', 바로 '너비'다. 위젯은 하나의 어플리케이션이다. 하지만 일반 어플리케이션이나 웹어플리케이션과 달리 위젯은 외적인 요소가 매우 중요하다. 단지 예쁘거나 혹은 안예쁘거나를 가름짓는 디자인 뿐 아니라, 위젯이 깨지는지, 혹은 '노출해야 할 컨텐츠를 제대로 노출을 못하고 있는지'와 같은 외적인 요소가 다른 어플리케이션 개발때보다 더 중요하..

