Qt 레이아웃을 더 예쁘게 만드는 방법

Qt 레이아웃을 더 예쁘게 만드는 방법

Author : Jino Bae / Send Mail

가장 먼저 레이아웃을 더 예쁘게 만들기 위해선 기본 레이아웃을 벗어나는 것이 중요하다. 물론 기본 레이아웃 안에서도 충분히 예쁘게 만들 수 있으나 프로그램의 일관성을 유지한다거나 독특한 레이아웃으로 사람들의 시선을 사로 잡는 것도 중요하다고 생각한다.


다만 프레임을 제거하고 나면, 예로들어 윈도우에서 기본으로 제공하는 최소화, 최대화, 종료, 윈도우 이동 등을 사용할 수 없으므로 프로그래머가 직접 해당기능을 구현해 주어야한다. 하지만 너무 큰 걱정은 하지 않길 바란다. 이 글에서 종료와 윈도우 이동까지는 다루고 있으니 말이다.


프레임 제거

Qt에서 프레임을 제거하는 방법은 매우 간단하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "memo.h"
#include "ui_memo.h"

memo::memo(QWidget *parent) :
    QMainWindow(parent/*,Qt::FramelessWindowHint*/),
    ui(new Ui::memo)
{
    ui->setupUi(this);
    //setWindowFlags(Qt::FramelessWindowHint);
}

memo::~memo()
{
    delete ui;
}

위에 표시된 두 주석중 하나를 사용하면 된다.


윈도우 종료

프레임을 제거하고 프로그래머가 임의의 버튼을 하나 생성한다. 이후 버튼의 on_Button_Click()이벤트를 구현하고 close(); 함수를 이벤트내에 삽입하면 된다.

1
2
3
4
void MainWindow::on_Exit_Button_clicked()
{
    close();
}


윈도우 이동

아래 작성된 코드를 그대로 헤더와 소스에 복사 붙여넣기를 하면 간단하게 구현된다.

헤더파일

1
2
3
4
5
6
7
protected:
   void mousePressEvent(QMouseEvent * event);
   void mouseReleaseEvent(QMouseEvent * event);
   void mouseMoveEvent(QMouseEvent * event);
   void resizeEvent(QResizeEvent* event);
   int m_nMouseClick_X_Coordinate;
   int m_nMouseClick_Y_Coordinate;


소스파일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool isMouseDown;

void MainForm::mousePressEvent(QMouseEvent *event) {
   if (event->button() == Qt::LeftButton) {
      m_nMouseClick_X_Coordinate = event->x();
      m_nMouseClick_Y_Coordinate = event->y();
      isMouseDown = true;
   }
}

void MainForm::mouseReleaseEvent(QMouseEvent *event) {
   isMouseDown = false;
}

void MainForm::mouseMoveEvent(QMouseEvent *event) {
   if (isMouseDown == true) {
      move(event->globalX()-m_nMouseClick_X_Coordinate,event->globalY()-m_nMouseClick_Y_Coordinate);
   }
}

소스코드를 간단히 설명하자면 마우스가 Press되었을때 마우스의 위치를 받아서 마우스가 Move될 때 위치를 마우스가 있었던 위치에서 마우스가 있는 위치로 상대적인 이동을 시킨다. 만약 m_nMouseClick_X_Coordinate 변수(이름은 달라도 상관없다)를 사용하지 않는다면 레이아웃의 어디를 클릭하던 레이아웃은 마우스가 있는 곳으로 절대적인 위치로 이동된다. 사용자의 입장에선 굉장히 불편하고 이해가 안가는 동작일 것이다.


위 소스를 이용하여 작성된 레이아웃


Jino Bae
WRITTEN BY

Jino Bae

Digital is a purely man-made playground. That's why I like.
im@baejino.com


comments powered by Disqus