MDI 구성을 위해 예제에서 가져와서 사용하다보니 약간의 불편한 부분이 존재합니다.
예제를 보여주기 위해 텍스트 편집기를 구성해 두었으며, 필요없는 부분을 삭제하여 재구성해야 합니다.
mdichild.h를 열어 보면 QTextEdit로 부터 상속 받아 사용하고 있는 것을 알수 있습니다.
이 부분을 QWidget으로 상속 받도록 아래와 같이 수정합니다.
프로젝트 이름(여기서는 GraphicEditor)에서 마우스 오른쪽 버튼을 눌러 생성된 팝업 메뉴에서 Build를 실행합니다.
Build를 실행하면 다음과 같이 13개의 에러가 발생합니다.
에러 항목을 마우스로 더블클릭하면 다음과 같이 해당 소스가 화면에 나타납니다.
해당 소스를 아래와 같이 주석문 처리를 합니다.
순서대로 하나씩 같은 방식으로 주석문 처리하여 에러가 발생하지 않도록 수정합니다.
모두 수정한 후 Build를 하면 다음과 같이 6개의 에러가 다시 발생합니다.
약간의 장단점이 있는 부분인데, 대형 프로젝트를 수행하다 보면, 전체 소스 컴파일을 하는 데 오랜 시간이 걸리게 됩니다. 이때 에러가 발생하면 중간에 끊어서 수정후 다시 진행하도록 구성하는 개발툴이 있고, 끝까지 에러를 표출하며 진행하는 개발툴이 있습니다. QT는 첫번째 툴에 해당합니다.
같은 방식으로 6개의 에러를 수정합니다.
소스가 점점 커지다 보면 에러가 발생했는데 Warning이 많아 에러를 찾을 수 없는 경우가 발생할 경우가 있습니다.
노란 삼각형 느낌표 체크를 클릭하여 체크를 풀면 다음과 같이 Warning을 제외하고 에러만 표시하게 됩니다.
다음은 에러를 모두 수정하여 컴파일이 완료된 모양입니다.
아래에서 DrawTools.zip 파일을 다운받아 압축을 풀어 다음과 같이 프로젝트 폴더에 넣어 줍니다.
프로젝트 이름에서 마우스 오른쪽 버튼을 누르면 다음과 같이 팝업 메뉴가 나타납니다.
Add Existing Files를 실행하면 다음과 같이 화면에 나타납니다.
복사한 파일들을 모두 선택한 후 열기를 클릭하면 다음과 같이 프로젝트에 추가됩니다.
DrawTools.cpp를 열어 가장 간단한 DrawLine 소스를 보면 다음과 같습니다.
첫번째 인자로 QPainter를 넘겨 주고 있으며, 좌표에 색상 및 PenStyle을 넘겨 주고 있습니다.
함수 내부에서 Pen을 만들어 설정하고 drawLine함수를 이용하여 선을 그리고 있습니다.
CPen, COLORREF 등은 QT에서 지원하는 클래스와 타입이 아닙니다.
필자가 QT를 처음 사용할 때에는 Visual C++ 문법이 더 익숙하여 Visual C++에서 지원하는 클래스와 타입을 그대로 사용할 수 있도록 제작을 해서 사용했습니다(이런 부분들 때문에 DrawTools클래스 하나를 사용하고자 하는데 여러 파일을 추가했으며, 향후 DLL 제작에서 DLL을 만들고 나면 불편함은 사라지게 될것입니다).
이렇게 할 경우 장점은 기존에 Visual C++에서 사용하던 루틴을 가져와 조금만 수정하면 바로 사용할 수 있게 되므로 참고 하시면 될듯합니다.
이제 DrawTools을 사용하여 화면에 그려보도록 하겠습니다.
QWidget에서 상속 받은 클래스는 다음과 같이 paintEvent 함수를 작성하면 화면이 갱신되어야 할때 자동으로 호출이됩니다.
void MdiChild::paintEvent(QPaintEvent *event)
{
QPainter painter;
painter.begin(this);
painter.end();
}
mdichild.h를 열어 다음과 같이 override로 선언하여 작성합니다.
void paintEvent(QPaintEvent *event) override;
override는 클래스에서 가장 중요한 개념이며, 여기서는 자식클래스인 QWidget에서 virtual로 선언된 paintEvent를 호출하면 부모클래스인 MdiChild 클래스의 paintEvent가 자동으로 호출이 된다는 정도로만 이해하시면 됩니다. 이후 다시 자세히 설명드릴 예정입니다.
이제 paintEvent 함수에 다음과 같이 루틴을 추가해 보도록 하겠습니다.
DrawTools를 사용하기위해 DrawTools.h파일을 include했으며, 빨간색으로 선을, 녹색으로 사각형을, 파란색으로 둥근사각형을, 노란색으로 원을 그리도록 한 루틴입니다.
소스는 아래와 같습니다.
CDrawTools drawTools;
drawTools.DrawLine(&painter, 100, 100, 200, 200, RGB(255, 0, 0));
drawTools.DrawRect(&painter, 300, 100, 400, 200, RGB(0, 0, 0), RGB(0, 255, 0));
drawTools.DrawRoundRect(&painter, 100, 300, 200, 400, RGB(0, 0, 0), RGB(0, 0, 255));
drawTools.DrawEllipse(&painter, 300, 300, 400, 400, RGB(0, 0, 0), RGB(255, 255, 0));
F5를 누르면 다음과 같이 실행이 됩니다.
새파일 아이콘을 클릭하면 다음과 같이 화면에 나타납니다.
이제 텍스트 편집기에서 사용한 이름인 document1.txt를 수정해보도록 하겠습니다.
mdichild.cpp에서 newFile 함수를 찾아가보면 다음과 같이 화면에 나타납니다.
document%1.txt 대신 다음과 같이 noname%d.img 로 수정합니다.
실행을 하여 새파일 아이콘을 클릭하면 다음과 같이 수정되어 나타납니다.
예제 프로그램
'QT' 카테고리의 다른 글
QT07. 메모리 및 마우스 처리 (0) | 2022.03.06 |
---|---|
QT05. 대화상자 (0) | 2022.03.04 |
QT03. MDI 및 아이콘 (0) | 2022.02.27 |
QT02. 기본 프로그램 만들기 (0) | 2022.02.27 |
QT01. 설치하기 (0) | 2022.02.25 |