디자이너를 이용하면 메인윈도우도 간단히 만들수 있습니다.
특히 많은 메뉴들과 툴바아이콘들을 배치해야 할 경우 보면서 할수있기에 편리합니다.

디자이너로 메인윈도우를 만들려면, 디자이너를 실행시키고 메인윈도우를 선택합니다.

메인 윈도우 만들기


메인윈도우를 생성하고 나면 메뉴바 위치에 Type Here 라는 문구가 보입니다. 여기서부터 메뉴와 액션들을 추가해 갈수 있습니다.

참고로 여기서부터는 메뉴와 각종 텍스트는 영어로 작성하도록 하겠습니다.
이유는 기본 언어를 영어로 하고, 번역판으로 한국어를 제공하는 방식으로 하기 위해서 입니다.
물론 기본 언어를 한국어로 해도 되고, 국내이용자만을 대상으로 하는 경우라면 그걸로도 충분 할 것입니다.
이에 따른 차이는 나중에 또 별도로 설명하겠습니다.

한번 파일 메뉴와 새 파일 액션을 추가해보세요. Type Here 라는 곳을 더블 클릭하여 &File 이라고 입력한 후 엔터를 누르면 파일 메뉴가 생성됩니다.
이상태에서 파일 메뉴를 클릭하면 메뉴창이 열리고 그 아래에는 또 Type Here 이라는 문구와, Add Seperator 라는 문구가 보입니다.
Type Here를 더블 클릭하고 메뉴를 생성할 때와 같은 요령으로 &New File 이라고 입력하면 새 파일 액션이 생성됩니다.
그런데 새 파일 액션의 오랜쪽에 + 같은 모양의 아이콘이 보일 것입니다.
이 아이콘은 액션을 메뉴로 확장하는 아이콘으로, 하위 메뉴를 만들 때 이용합니다.

메뉴와 액션의 문자열을 고치고 싶을 때는 메뉴상에서 더블 클릭하여 고치면되며, 그외의 속성들을 수정할 때는, 다른 위젯들과 동일하게 Object Inspector와 Property Editor를 이용하여 수정할 수 있습니다.
또한, 액션의 경우 액션만을 위한 Action Editor 라는 것이 제공됩니다.
Action Editor는 디자이너의 기본 레이아웃이라면 오른쪽 하단의 Signal/Slot Editor와 겹쳐져 있으니, Action Editor 탭을 눌러서 표시할 수 있습니다.

Action Editor

Action Editor를 보면 방금 만든 새 파일 액션이 보입니다.
한번 더블 클릭해보면, Edit Action이라는 다이얼로그가 나타납니다.
이 다이얼로그는 Property Editor에서 특히 액션의 경우 자주 편집되는 부분만 모아 놓은 것이라고 생각하면 됩니다.
ToolTip외에는 별도로 항목에 대한 설명은 필요 없어 보입니다.

우선 아이콘을 지정해봅시다.
이전과 마찬가지로 로컬 파일을이용할 수 도 있고, Qt의 리소스를 이용할 수도 있습니다.
Qt의 리소스를 이용하는 경우, 디자이너를 이용하여 리소스를 쉽게 관리할 수 있습니다.
여기서는 Qt 리소스를 이용하는 법도 배울 겸, 리소스를 이용하여 아이콘을 지정해보겠습니다.
Icon 항목의 오른쪽의 ... 버튼을 클릭해보면 Select Resource 다이얼로그가 나타납니다.
하지만 현재 불러온 리소스 파일이 없기 때문에 아무것도 선택할 수 없습니다.
여기서 상단의 연필 모양 버튼을 클릭하면 Edit Resources 다이얼로그가 나타납니다.
이 창의 하단을 보면 왼쪽에 두개의 버튼이 활성화되있는데요, 왼쪽은 새로운 리소스 파일(.qrc)파일을 만드는 버튼이고, 오른쪽은 기존의 리소스 파일을 여는 버튼입니다.

이전에 만들었던 리소스 파일을 열어 보면 이전에 넣어 둔 아이콘 파일이 하나 표시될 것입니다.
여기서는 연습 삼아 새로운 리소스 파일을 만들어 보겠습니다.
열린 리소스 파일을, 왼쪽의 X 버튼으로 닫고, 새 리소스 파일을 만듭니다.
여기서는 이전에 만든 resources.qrc 파일에 덮어 씌우겠씁니다.
이제 오른쪽 버튼들이 활성화 됩니다.
우선 + 버튼을 눌러서 prefix를 추가합니다.
prefix는 리소스에 접근 할때의 최상위 경로로 보통은 / 로 하면됩니다.
그후 오른쪽에서 두번째 버튼으로 리소스를 엽니다.
이전에 첨부한 소스 파일을 보면, img 디렉토리 안에 두개의 이미지 파일이 있습니다.
두개 모두 선택하여 추가 한후 OK 버튼을 누르면 리소스 파일이 편집되어 저장됩니다.
참고로 리소스를 삭제할 때는 제일 오른쪽의 - 버튼을 이용하면 됩니다.
또, 리소스는 Action Editor의 오른쪽 탭에 있는 Resource Browser를 통해서도 열람/편집이 가능합니다.

다시 Select Resource 창으로 돌아왔습니다,
이제 방금 추가한 두개의 이미지를 선택할 수 있습니다.
적당한 이미지를 선택한 후, OK를 누르면 아이콘이 선택된 것을 확인 할 수 있습니다.

그외에 Object name은 원하는 이름으로(저는 newFileAction)으로 입력하시고, Shortcut으로 단축키를지정합니다(저는 Ctrl+N).
단축키는 오른쪽의 화살표 버튼을 클릭한후 실제로 키보드로 원하는 단축키를 누르면 자동으로 입력됩니다.

이것으로 액션편집이 끝났습니다.
이번에는 툴바를 만들어 보겠습니다.
메인 윈도우의 적당히 가운데에서 오른쪽 클릭을 해보면 Add Tool Bar라는 메뉴가 제일 상단에 나타납니다.
이 메뉴를 선택하면 메뉴바 밑에 가느다란 툴바가 추가 됩니다.
툴바가 가느다란 이유는 아직 아무것도 안들어 있기 때문입니다.
여기에 방금 만든 새파일 메뉴를 추가해보겠습니다.
Action Editor에서 추가할 액션을 드래그 하여 툴바에 드랍하면 됩니다.

마지막으로 메인 윈도우의 central widget을 지정해봅시다.
정확히 말하면, 디자이너에서 만든 메인윈도우의 경우 central widget은 무조건 평범한 QWidget이 들어가게됩니다.
그대신 디자이너에서는 그 위젯 안에 다른 위젯을 넣어서 표시할 수가 있습니다.
우리는 텍스트 에디터를 만들고 있으므로 왼쪽에서 Text Edit 위젯을 가져오서 메인 윈도우의 가운데에 놓고, Object Name을 edit로 지정합니다.
그후 방금 내려놓은 Text Edit 외의 적당히 다른 부분을 클릭하면 상단의 레이아웃 툴바가 활성화됩니다.
이상태에서 적당한 레이아웃(여기서는 다른 위젯을 배치하지는 않으므로 아무거나 상관없습니다).
여기서 레이아웃을 지정해야 하는 이유는 자동으로 크기가 조절되도록 하기 위해서 입니다.
저는 Lay Out Horizontally 를 선택하였습니다.
그런데 이상태로는 Text Edit 상하좌우로 여백이 들어가 버립니다.
이 여백은, 레이아웃을 넣은 위젯의 property에서 없앨 수가 있습니다.
Object Inspector에서 방금 레이아웃을 넣은 위젯(아마도 특별히 수정하지 않았으면 centralwidget이라고 되어있는 위젯)을 선택한 후, Property Editor의 가장 아래쪽을 보면 Layout 이라는 항목이 보일 것입니다.
여기서 LayoutLeftMargin, LayoutRightMargin, LayoutTopMargin, LayoutBottomMargin을 0으로 입력해주면 Text Edit 주변의 여백이 없어질 것입니다.

마지막으로 메인윈도우의 프로퍼티에서 윈도우 아이콘으로 리소스의 document-edit.png 파일을 선택해주고, 윈도우 타이틀도 적당히 적어줍시다(저는 Text Editor라고 해주었습니다).
이상태에서 Ctrl+R을 눌러 미리보기를 해봅시다.
겉모습만 보면 이전에 만든 texteditor 프로그램과 동일 할 것입니다.
이 상태에서 한번 툴바의 버튼에 마우스 커서를 올려놓고 가만히 둬보세요.
New File이라는 작은 텍스트가 표시됩니다.
이것이 아까 설명하지 않고 지나간 액션의 ToolTip입니다.
기본적으로는 액션의 Text가 그대로 표시되지만, ToolTip을 적당히 수정하여 원하는 텍스트가 표시되게 할 수도 있습니다.

여기서 작성한 파일을 mainwindow.ui라는 이름으로 저장한 후, 실제 코드에서 불러와서 적용합니다.
우선 새로운 ui파일을 만들었으므로 프로필 파일(texteditor.pro)에 다음과 같이 FORMS 항목을 추가해줍니다.

FORMS += mainwindow.ui

그리고 mainwindow.cpp를 대대적으로 수정해줍니다.

[code]#include "mainwindow.h"
#include "ui_mainwindow.h"

struct MainWindow::Data {
    Ui::MainWindow ui;
};

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), d(new Data) {
    d->ui.setupUi(this);
   
    connect(d->ui.newFileAction, SIGNAL(triggered()), this, SLOT(newFile()));
}

MainWindow::~MainWindow() {
    delete d;
}

void MainWindow::newFile() {
    d->ui.edit->clear();
}
[/code]
기본적인 요령은 이전에 설명한 폼 디자인 적용하기와 마찬가지로, setupUi() 함수를 호출 하여 줍니다.
이전 소스와 비교해보면 아시겠지만 메인 윈도우에서 메뉴바나 툴바를 생성하는 과정이 디자이너를 이용함으로서 생략되어 훨씬 간략한 소스가 되었습니다.
그리고 액션이나 Text Edit는 이제 Ui::MainWindow의 멤버이기 때문에 d->edit 등은 d->ui.edit 등으로 수정해주었습니다.

마지막으로 소스파일을첨부하고 디자이너를 이용한 메인윈도우 만들기를 마칩니다.
첨부한 소스파일에는, 이외에도 별도의 설명없이 간단히 구현할 수 있는 몇가지 메뉴가 더 추가되어있습니다.
소스코드를 보시고 이해가 안되시면 질문해주세요.

texteditor.tar.gz

예제 소스코드


Posted by xylosper

2009/09/08 09:42 2009/09/08 09:42
, , , , ,
Response
No Trackback , a comment
RSS :
http://xylosper.net/rss/response/134

Trackback URL : http://xylosper.net/trackback/134

실제로 어플리케이션을 만들다보면, 모든 것이 소스코드만으로 해결되지 않는 경우가 많습니다.
그 대표적인 예가 어플리케이션에서 이용하는 아이콘들입니다.
이번 회에서는 어플리케이션과 액션에 아이콘을 적용해보고, Qt의 리소스에 대해서 알아보겠습니다.
texteditor.tar.gz

예제 파일

이번회에서는 mainwindow.cpp에 다음 두줄을 생성자의 마지막에 추가합니다.
[code]
...
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), d(new Data) {
...
    setWindowIcon(QIcon("img/document-edit.png"));
    d->newFileAction->setIcon(QIcon(":/img/document-new.png"));
}
[/code]
그리고 소스코드와 같은 위치에 다음과 같은 내용의 resources.qrc 파일을 작성합니다.
[code]
<RCC>
    <qresource prefix="/" >
        <file>img/document-new.png</file>
    </qresource>
</RCC>
[/code]
마지막으로 texteditor.pro파일에 다음 한줄을 추가합니다.
[code]
RESOURCES += resources.qrc
[/code]
먼저 mainwindow.cpp의 추가된 라인을 살펴보겠습니다. setWindowIcon()이라는 함수가 호출되고 있는데, 이것은 QWidget::setWindowIcon()으로, 모든 위젯이 가지고 있는 함수입니다.
이를 이용하여 해당 위젯이 최상위 위젯일때 표시되는 아이콘을 지정할 수 있습니다.
이 함수는 QIcon의 객체를 인자로 받는데, QIcon은 딱 보면 알수 있듯이 아이콘에 대한 클래스입니다.
가장 간단한 사용방법은, 위와 같이 QIcon(이미지파일 경로)와 같이 생성하는 것입니다.
이미지 경로가 img/document-edit.png로 되어있는데, 이것은 작업경로에 대한 상대경로로, 당연히 절대경로도 가능합니다.

첨부된 예제소스를 받아보면, 소스코드가 있는곳에 img라는 디렉토리가 추가되어있고 그 안에 이미지 파일이 들어있는 것을 확인 할수 있습니다. 현재는 소스코드가 있는 곳에서 빌드하고 실행하기 때문에, 이 경로로 이미지의 위치를 제대로 인식하지만, 만약 실행파일이 다른 곳으로 옮겨지는등 작업경로가 변경되면 이미지를 인식 할 수 없게됩니다.
또한 실제 배포시에는 이미지를 각 시스템에 맞게 별도로 제공해야 할 수도 있습니다.
그럼 절대 경로를 이용하면 되지 않느냐? 라고 생각 할수도 있겠지만, 이경우는 배포시의 경로를 강제해야 하고, 이것은 합리적이지 못합니다.

이럴 때, '리소스'를 이용할 수 있습니다.
Qt의 리소스 시스템이란, 바이너리 파일을 실행파일에 포함시켜버리는 것을 말합니다.
즉, 애시당초 이미지를 별도로 다루지 않고, 실행파일에 붙여버리는 것입니다.
이러면 배포할때 이미지 경로를 신경쓰지 않아도 될 뿐만 아니라, 실행파일과 이미지를 함께 배포해야 하는 수고를 덜수 있습니다.

리소스로 이용하고 싶은 파일들은 위에 적은 resources.qrc파일처럼 형식에 맞게 목록을 작성하여 qrc의 확장자로 목록을 저장한후, texteditor.pro파일 처럼 프로필 파일에 'RESOURCES += 리소스 목록 파일'과 같이 리소스 목록 파일을 지정해주어야 합니다.
qrc파일의 형식은 매우 간단하므로 별도 설명은 하지 않습니다. 좀더 다양한 활용법에 대해서는 assistant를 참고하시기 바랍니다.

생성자에 추가된 마지막 줄은 이 리소스 파일로부터 아이콘을 만들고 있는 코드입니다.
QIcon의 생성자로 넘긴 이미지 파일의 경로를 보면 :/ 로 시작하고 있습니다. :/로 시작하는 경로는 리소스 파일에 대한 경로입니다. 이와 같이 리소스로 추가된 파일을, 실제 소스코드내에서 불러올때는 반드시 :로 시작하는 경로를 입력해야 합니다. /는 리소스 목록 파일에서 prefix로 지정된 경로로, 만약 prefix="/rsc"와 같이 지정했었다면 :/img/document-new.png가 아니라 :/rsc/img/document-new.png 와 같이 해야 할 것입니다.
QAction::setIcon()함수는 해당 액션에 아이콘을 지정하는 함수입니다. 액션의 아이콘은, 다음과 같은 역할을 합니다.
1. 툴바에 표시된 액션의 아이콘
2. 메뉴에 표시된 액션의 아이콘

이리하여 실행해보면 두가지 아이콘이 적용된 모습을 볼 수 있습니다.
실행화면

실행화면

이번회에서는 리소스의 예로 이미지 파일을 들었지만, 그외에도 여러가지 활용법이 있습니다.
예를 들면 소스코드에 직접 적어 넣기 힘든 문서내용을, 텍스트파일로 저장하여 불러올수 있습니다.
혹은 특정 동작에 대한 소리를 리소스로 집어 넣을 수도 있습니다.

Posted by xylosper

2009/04/15 19:17 2009/04/15 19:17
, , , , , ,
Response
No Trackback , 4 Comments
RSS :
http://xylosper.net/rss/response/132

Trackback URL : http://xylosper.net/trackback/132

프로그램이라는게 혼자쓸려고 만드는 경우도 있지만, 처음부터 배포를 목적으로 하거나, 혼자쓰다가 배포하고 싶어지기도 하죠.

Qt로 짠 프로그램을 배포할때 몇가지 주의해야할 사항을 적어봅니다.

1. 라이센스 표시

상용 라이센스를 구입한 경우라면 해당되지 않지만, 오픈소스에디션의 Qt를 이용한 경우에는 반드시 GPL에 따라서 배포해야합니다(따르지 않을 경우 라이센스 위반입니다).
우선 GPL 영어 전문을 포함시켜야합니다. 그리고 소스배포가 아니라 바이너리 배포인 경우, 소스를 함께 배포하거나 소스를 제공받을 수 있는 방법을 명시해야합니다. 보통 온라인상에서 소스와 바이너리를 함께 다운 받을수 있도록 하는 경우가 많습니다.
이부분은, 라이센스를 지키겠다는 의지와 노력을 보이는 것이 중요하니, 너무 라이센스의 법적인 부분에 대해서 얽메여서 어떻게 해야하나 전전긍긍할 필요는 없습니다.

2. 라이브러리

당연한 이야기이지만, Qt로 만든 프로그램은 Qt 라이브러리가 있어야 실행 할 수 있습니다. 리눅스등에서 KDE환경이라면 보통 기본적으로 Qt가 깔려있으니 문제 없지만, 그렇지 않은 경우(윈도우, Gnome환경 등)에는 상대방에게 Qt 라이브러리를 설치하도록 하거나 이쪽에서 제공해줘야겠죠.
리눅스의 경우는 대부분 저장소에서 설치하면 되므로 큰 문제가 되지 않습니다만, 윈도우(맥은 잘 모르겠네요)의 경우는 좀 귀찮아집니다.
이에 대한 해결법으로 보통 두가지 방법이 있습니다.

1) 정적 라이브러리 이용

빌드시에 정적 라이브러리를 이용하면, 실행파일에 라이브러리 내용도 전부 포함되므로, 따로 Qt라이브러리 파일을 배포할 필요가 없어집니다. 다만, 이경우 여러개의 실행파일을 이용하는 어플리케이션이라면, 각각의 실행파일에 중복되어 Qt가 들어가 용량이 너무 커질수 있습니다.
Qt로 정적빌드하는 법은 팁1편을 참고하세요.

2) 동적 라이브러리 이용

동적 라이브러리를 이용하기 위해서는, 윈도우에서는 같은 폴더내의 dll파일을 인식하므로, 실행파일과 라이브러리 파일들을 복사해서 함께 배포하면 됩니다.
이때 모든 파일을 배포할 필요는 없고, 빌드시에 링크된 라이브러리 파일만 복사하면 됩니다.
예를들어 네트워크 관련 모듈을 이용하지 않았다면, QtNetwork라이브러리 파일은 필요없겠죠.

마지막으로, VC++을 이용하여 빌드된 경우, 재배포용 패키지(VCRedist)가 필요한 경우가 있습니다.
이것은 Qt로인한 것이 아니라 VC++(아마도 2005이후?)로 빌드된 모든 프로그램에 해당되는 것입니다.
관련패키지는 마이크로소프트 홈페이지에서 다운 받을 수 있습니다.

그외에도 더 자세한 설명이 어시스턴트의 'Deploying an Application on Qt/Windows'항목에 적혀있으므로 이쪽도 참고하시기 바랍니다.

Posted by xylosper

2008/09/03 17:52 2008/09/03 17:52
,
Response
No Trackback , No Comment
RSS :
http://xylosper.net/rss/response/124

Trackback URL : http://xylosper.net/trackback/124

Qt 팁 - 1. Qt로 정적(static) 빌드하기

Qt로 짠 프로그램을 배포할 때, 특히 윈도우나 맥에서, 사용자 측에서 Qt 라이브러리가 없어서 실행하지 못하는 경우가 많습니다.
이런 경우 해결책으로 Qt를 정적링크하여 실행파일에 넣어버리는 방법이 있는데요, Qt를 정적 링크(static link)하여 이용하기위해서는, 당연히, 정적 라이브러리 파일(.a)이 필요합니다.
Qt를 설치할때, 기본값으로 동적 라이브러리를 빌드하도록 되어있기 때문에, 정적 라이브러리 파일을 이용하기 위해서는 configure단계에서 -static 옵션을 주고 Qt를 설치하여야합니다.

다만 -static옵션을 주고 그대로 make를 쳐버릴 경우, 라이브러리 파일 뿐만 아니라, 각종 툴들과 예제 및 데모까지, Qt의 모든 바이너리 파일들이 정적 링크되어 빌드되므로 Qt의 용량이 어마어마하게 늘어납니다(끝까지 해본 적이 없어서 모르겠습니다. 10기가는 넘어갑니다).

(저도 다른 데서 본거긴 하지만) 제가 추천하는 방법은, 개발할때는 동적 링크된 Qt를 이용하고, 배포할때만 Qt를 정적링크하는 것입니다.
이렇게 하기 위해서는 두가지 Qt를 빌드해야합니다.

우선 개발용으로 동적 링크해서 쓸 Qt는 일반적인 방법(-static 옵션 없이)으로 빌드하여 이용하면 됩니다.
그리고 배포용으로 정적링크해서 쓸 Qt는 우선 -static 옵션을 주고 configure한후, make할때, 'make sub-src'를 이용하는 것입니다.
이렇게 할 경우, 라이브러리만 빌드하기 때문에 빌드 시간도 짧고 용량도 그리 크게 차지하지 않습니다.
다만 이 경우엔 정말 라이브러리 외에는 아무것도 빌드하지 않기 때문에, 예를 들어 디자이너나 어시스턴트 등도 빌드되지 않습니다.
그러므로 이러한 툴이나 예제들은 위에서 말한 개발용 Qt에 포함된 녀석을 이용해야겠지요.
참고로 이렇게 빌드한 정적링크 Qt는 'make install'을 하지 말고 복사해서 쓰거나 직접 경로를 지정해서 써야합니다.
만약 make install을 실행하면, 빌드하지 않은 모든 것들을 빌드한후 복사될 것입니다.

정리하면,

  1. 일반적인 방법으로(-static옵션 없이) Qt를 빌드
  2. 정적 링크용 Qt를 빌드
    1. configure -static [기타 옵션]
    2. make sub-src
    3. 빌드된 것을 복사해서 이용

Posted by xylosper

2008/09/03 11:06 2008/09/03 11:06
, ,
Response
No Trackback , 5 Comments
RSS :
http://xylosper.net/rss/response/125

Trackback URL : http://xylosper.net/trackback/125

이번에는 메뉴를 작성하고 툴바를 생성하는 방법을 살펴보겠습니다.
texteditor.tar.gz

예제 소스 코드

일단 '새 파일'메뉴를 만들어 봅시다.

mainwindow.h
[code]
...
class MainWindow : public QMainWindow {
...
private slots:
    void newFile();
private:
...
};
[/code]
해더파일에는 위와 같이 '새 파일'메뉴가 실행되었을때 새파일을 만들어주기 위해 호출할 슬롯함수 newFIle()을 선언해두었습니다(슬롯으로 선언한 이유는 곧 나옵니다).

mainwindow.cpp
[code]
#include "mainwindow.h"
#include <QTextEdit>
#include <QMenuBar>
#include <QToolBar>

struct MainWindow::Data {
    QTextEdit *edit;
    QAction *newFileAction;
};

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), d(new Data) {
    d->edit = new QTextEdit(this);
    setCentralWidget(d->edit);
   
    QMenuBar *mb = menuBar();
   
    QMenu *fileMenu = mb->addMenu(trUtf8("파일(&F)"));
    d->newFileAction = fileMenu->addAction(trUtf8("새 파일(&N)"));
    d->newFileAction->setShortcut(QKeySequence("Ctrl+N"));
   
    QToolBar *fileBar = addToolBar(trUtf8("파일 도구막대"));
    fileBar->addAction(d->newFileAction);
   
    connect(d->newFileAction, SIGNAL(triggered()), this, SLOT(newFile()));
}

MainWindow::~MainWindow() {
    delete d;
}

void MainWindow::newFile() {
    d->edit->clear();
}
[/code]
mainwindow.cpp 가 변한 점을 하나씩 집어가도록 하겠습니다.

우선 해더파일이 늘었는데, 메뉴바 클래스인 QMenuBar나 툴바 클래스인 QToolBar를 이용하기위해서포함시킨 것들입니다.
그외에도 QMenu나 QAction등이 필요합니다만, QMenuBar안에 이미 포함되어있기 때문에 생략했습니다.

데이터클래스에 QAction *newFileAction 이라는 멤버가 추가되었습니다.
여기서 한가지 분명히 해두어야 할게 있습니다.
우리가 보통 '메뉴'라고 하면, 예를 들어, "'파일'메뉴의 '새 파일'메뉴"라고 하듯이, 목록(파일 메뉴)과 그 아래의 항목(새파일 메뉴)을 모두 메뉴라고 칭합니다.
Qt에서는, 그러한 목록은 QMenu 클래스로, 그리고 하위 항목들은 QAction 클래스로 구현합니다.
따라서 앞으로 메뉴 라고 하면 QMenu 클래스로 구현되는 목록을, 액션이라고 하면 메뉴의 하위 항목을 지칭하는 것으로 정하겠습니다.

그런데, 예를 들어 파일 메뉴의 하위항목으로 최근 파일 목록 같은 메뉴가 들어가 있어서, 메뉴가 메뉴를 포함하고 있는 경우도 많습니다.
그래서, 메뉴 자체도 거기에 대응하는 하나의 액션을 가지고 있고, 위젯으로서의 속성외의 것들은 액션으로 관리됩니다.
메뉴에 대응되는 액션은, QMenu::menuAction()으로 얻을수 있습니다.
반대로, 액션의 경우, 메뉴에 대응된 액션이라면, QAction::menu()가 널이 아닌 포인터를 반환합니다.
예를 들어, 메뉴항목을 숨기고 싶다면 QMenu::hide()가 아니라, 그 메뉴에 대응되는 액선의, QAction::setVisible(false)를 이용해야합니다.

newFileAction은 새파일을 만들기 위한 액션입니다. 액션의 사용법은 생성자를 살펴볼때 설명하겠습니다.

이제 생성자를 살펴보겠습니다.

QMenuBar *mb = menuBar();

이 한줄이 메뉴바를 생성하는 한줄입니다. 메뉴바는 QMainWindow::menuBar()가 처음으로 호출 될때 생성되며, 그이후로 menuBar()함수가 호출되면 이미 생성된 메뉴바에 대한 포인터를 반환합니다.
이제 메뉴바에 메뉴를 추가합시다.

QMenu *fileMenu = mb->addMenu(trUtf8("파일(&F)"));

trUtf8()가 뭔지 기억이 안나신다면 4편을 참고하세요.

QMenu는, 위에서 설명했듯이 메뉴 목록을 나타내기위한 클래스로, 실제로 메뉴바에서 클릭했을때 표시되는 '창'이기때문에, QMenu도 역시 QWidget을 상속받아서 구현되어있습니다.

QMenuBar::addMenu()함수는 다음의 세가지 형태로 오버로드되어있습니다.

1. QAction *addMenu(QMenu *menu)
이미 존재하는 QMenu 인스턴스를 메뉴바에 추가할때 이용합니다.
여기서 반환되는 QAction*은, menu 메뉴에 대응되는 액션에 대한 포인터로, menu->menuAction()과 동일한 값입니다.

2. QMenu *addMenu(const QString &title)
메뉴바에 title이란 타이틀의 메뉴를 추가하여, 그 메뉴를 가리키는 포인터를 반환합니다.
타이틀은 메뉴바에서 표시되는 메뉴의 이름이며, 메뉴가 다른 메뉴에 포함되는 경우에는 해당 메뉴의 항목에 표시되는 이름입니다.
참고로, 이 항목이름도 메뉴에 대응되는 액션에 의해서 관리됩니다.

3. QMenu *addMenu(const QIcon &icon, const QString &title)
icon으로 지정된 아이콘을 설정해준다는 점 이외에는 2번과 다를바없습니다.
메뉴바에 추가된 메뉴에 대해서는 아이콘을 표시하지 않기 때문에 의미가 없습니다만, 메뉴의 하위 항목으로 메뉴가 들어가있는 경우에 타이틀 옆에 아이콘을 표시해줍니다.
타이틀과 마찬가지로, 메뉴에 대응되는 액션에의해 관리됩니다.

여기서는 2번을 이용하여, '파일'이라는 타이틀의 메뉴를 생성하였습니다.
참고로, (&F) 라는 것은, 이미 GUI프로그래밍 경험이 있으신분이라면 설명하지 않아도 아실 듯한데요, 보통 알트키와 함께 눌렀을떄 메뉴나 액션이 실행되는 단축키(정확한 명칭은 모르겠네요)입니다.
이경우 알트+F를 누르면 파일메뉴목록이 표시되는 것이죠.

d->newFileAction = fileMenu->addAction(trUtf8("새 파일(&N)"));
이제 메뉴를 생성하였으니, 하위 항목으로 액션을 생성합니다.
일반적으로 모든 위젯은 액션 리스트를 가지고 있고, 여기에 액션을 추가하기위해서는 QWidget::addAction(QAction *)함수를 이용합니다만, QMenu클래스의 경우는 편의를 몇가지 오버로드된 addAction()함수를 제공합니다.
위 함수는 QAction *QMenu::addAction(const Qstring &text)의 원형을 가지고 있고, text라는 이름으로 표시되는 QAction인스턴스를 생성하여, 그 포인터를 반환해줍니다.
이걸로 파일 메뉴에 새 파일 액션이 생성되었습니다.

d->newFileAction->setShortcut(QKeySequence("Ctrl+N"));
액션의 단축키(shortcut)를 지정해줍니다. 단축키는 필수사항은 아니지만 자주이용하는 액션이라면 단축키가 있는 것이 편리하겠죠. 단축키는 QKeySequence 클래스를 이용하여 지정할 수 있습니다.
QKeySequence를 생성하는 데에는 몇가지 방법이 있는데, 다음 두가지가 가장 자주 이용됩니다.
QKeySequence(const QString &key);
QKeySequence(int k1, int k2 = 0, int k3 = 0, int k4 = 0);

이경우 전자를 이용하였는데, 바로 키를 문자열로 적는 방법입니다. 간단하죠? 후자의 경우는, 키코드를 입력하는 방법입니다. 후자를 이용하면, QKeySequence(Qt::CTRL + Qt::Key_N)과 같이 적을수 있습니다.


QToolBar *fileBar = addToolBar(trUtf8("파일 도구막대"));
QMainWindow::addToolBar()함수는 주어진 이름으로 툴바를 추가해줍니다. 툴바도 하나의 위젯이며 도킹윈도우처럼 자유롭게 메인윈도우에 붙였다 땔수 있고, 떨어져있을 경우 여기서 지정된 창이름으로 표시되고, 툴바에서 오른쪽 마우스 버튼을 클릭했을때 나타나는 툴바 목록에도 같은 이름으로 표시됩니다.

fileBar->addAction(d->newFileAction);
앞에서 설명했듯이, 모든 위젯은 자체의 액션 리스트를 가지고 있습니다. QToolBar클래스의 경우, 액션리스트를 툴바의 형태로 표시해줍니다. QToolBar클래스도 QMenu클래스와 마찬가지로 편의를 위해 다양한 형태로 오버로드된 addAction()함수를 제공하지만, 이경우는 이미 생성되어있는 액션을 추가하는 것이므로, addAction(QAction*)을 이용합니다.
이것으로 파일 툴바를 추가하고 거기에 새 파일 액션이 추가되었습니다.

connect(d->newFileAction, SIGNAL(triggered()), this, SLOT(newFile()));
QAction클래스에는 몇가지 시그널이 있는데 그중 다음 두개가 가장 자주 쓰입니다.
void QAction::triggered(bool checked = false);
void QAction::toggled(bool checked);
전자는 액션이 유저에의해서 활성화될때(클릭하거나 단축키를 누르거나 등...) 이 시그널이 발생합니다. 그리고 액션을 체크가능하게 설정했을 경우(setCheckable), check되있는 상태가 checked변수로 전달됩니다. 예제에서는 체크할수 있는 액션이 아니므로, 이변수는 무시하였습니다(디폴트 인자가 주어져있으므로 무시할수 있습니다).
후자는 체크가능한 액션에 대해서, 체크된 상태가 변했을때 발생합니다.
예제에서는 전자의 시그널을 이용하여, newFile()슬롯으로 연결하였습니다. 이처럼 액션은, triggered()나 toggled()시그널을, 원하는 동작을 하는 슬롯으로 연결하여 이용하는 것이 보통입니다.
이제 d->newFileAction이 실행될떄마다 newFile()함수가 호출됩니다.

그러면 마지막으로 newFile()함수를 살펴보겠습니다.
void MainWindow::newFile() {
    d->edit->clear();
}
간단합니다. QTextEdit::clear()함수는 내용을 모두 비워버리는 함수입니다. 지금 작성하고있는 어플리케이션은 SDI이므로, 현재 창을 깨끗이 비워주면 곧 새파일을 만드는 셈입니다. 물론 보통은 지금 작성중인 문서를 저장하겠냐는 둥 뭔가 추가로 작업을 해주어야 하지만, 일단은 이번편은 메뉴와 툴바를 만드는 법을 설명하는 것이 목표이므로 일단 간단하게 구현하였습니다.

이제 컴파일하고 실행해봅시다.
실행화면

실행화면

파일 메뉴가 추가되었고, 툴바도 생성된 것을 확인할수 있습니다.
적당히 몇글자 적어보고 툴바의 새 파일 버튼을 눌러보거나, 메뉴에서 새 파일을 클릭하거나, Ctrl+N을 눌러보면 작성된 내용이 모두 지워지는 것을 알수 있습니다.
그런데 뭔가 어색합니다. 보통 툴바에는 액션자체의 이름보다는, 아이콘이 표시되는데, 여기선 이름이 바로 표시되고있습니다.
아이콘을 지정해주면 되는데, 이건 매우 간단합니다. 하지만 여기서 함께 설명하지 않은 것은, 아이콘을 지정하는 것과 함께 '리소스'를 이용하는 방법을, 다음에 같이 설명하기 위해서입니다.
다음편에서는 리소스를 이용하는 법과, 리소스를 이용하여 아이콘을 설정하는 법을 알아보겠습니다.

Posted by xylosper

2008/09/02 09:52 2008/09/02 09:52
, , , , , ,
Response
No Trackback , No Comment
RSS :
http://xylosper.net/rss/response/123

Trackback URL : http://xylosper.net/trackback/123


Notices

Archives

Calendar

«   2010/09   »
      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    

Site Stats

Total hits:
173668
Today:
51
Yesterday:
44
The images of equations
in this website are CodeCogs - An Open Source Numerical Library