본문 바로가기

QT/QT 4.6.2

두개의 버튼을 하나의 창에 띄우기!!

2개의 버튼 위젯을 각각의 창에 띄우는 부분까지 실습을 한 뒤
이제 2개의 버튼을 하나의 창에 띄우는 부분에 대해서 공부를 해 보았다.

내가 공부한 부분은

QWidget 클래스 상속받아 하나의 위젯 안 버튼 위젯을 포함시키는 방법과
QDialog 클래스를 상속받아 하나의 다이얼로그 안에 버튼 위젯을 포함시키는 방법

이렇게 두가지 경우를 생각 해 보았다. 

먼저 QWidget 클래스 상속받거나 QWidget 클래스의 객체를 사용하는 방법으로 보면
일단 상속 받는 부분은 클래스로 구현하였고, 객체를 사용하는 방법은 main.cpp에서 작업을 하였다.

첫번째로 객체를 사용하는 소스를 보면,

#include 
#include 
#include 
#include 

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    QPushButton *button1;
    QPushButton *button2;
    QWidget *widget;
   
    widget = new QWidget;
    widget->setWindowTitle("Button Test");

    button1 = new QPushButton;
    button2 = new QPushButton;
  
    QHBoxLayout *layout = new QHBoxLayout;
  
    button1->setText("Button1");
    button2->setText("Button2");
  
    layout->addWidget(button1);
    layout->addWidget(button2);
  
    widget->setLayout(layout);

    widget->show();

    return app.exec();
}




이렇게 구현을 하였으며,
그리고 두번째로 상속을 받아서 출력하는 소스를 보면,

/***********************************************************
                      Button_Widget.h
***********************************************************/

#ifndef BUTTON_WIDGET_H
#define BUTTON_WIDGET_H
#include 
#include 

class QPushButton;

class Button_Widget : public QWidget
{
    Q_OBJECT
public:
    Button_Widget(QWidget *parent = 0);
private:
    QPushButton *button1;
    QPushButton *button2;
};
#endif // BUTTON_WIDGET_H


/***********************************************************
                      Button_Widget.cpp
***********************************************************/
#include 
#include "Button_Widget.h"

Button_Widget::Button_Widget(QWidget *parent) : QWidget (parent)
{
    button1 = new QPushButton;
    button2 = new QPushButton;

    button1->setText("Button1");
    button2->setText("Button2");

    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(button1);
    layout->addWidget(button2);
    setLayout(layout);
}

/***********************************************************
                      main.cpp
***********************************************************/
#include 
#include "Button_Widget.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Button_Widget *wid = new Button_Widget;

    wid->show();
    return app.exec();
}



이렇게 구현을 하였다.

다음으로 QDialog 클래스를 상속받거나 QDialog 클래스의 객체를 사용하는 방법을 보면
QWidget과 마찬가지로 상속 받는 부분은 클래스로 구현하였고, 객체를 사용하는 방법은 main.cpp에서 작업을 하였다.

첫번째로 객체를 사용하는 소스를 보면,

#include 
#include 
#include 
#include 

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    QPushButton *button1;
    QPushButton *button2;
    QDialog *dialog;
   
    dialog = new QDialog;
    dialog->setWindowTitle("Button Test");

    button1 = new QPushButton;
    button2 = new QPushButton;
  
    QHBoxLayout *layout = new QHBoxLayout;
  
    button1->setText("Button1");
    button2->setText("Button2");
  
    layout->addWidget(button1);
    layout->addWidget(button2);
  
    dialog->setLayout(layout);

    dialog->show();

    return app.exec();
}




이렇게 구현을 하였으며,
그리고 두번째로 상속을 받아서 출력하는 소스를 보면,

/***********************************************************
                      Button_Dialog.h
***********************************************************/

#ifndef BUTTON_DIALOG_H
#define BUTTON_DIALOG_H

#include 

class QPushButton;

class Button_Dialog : public QDialog
{
    Q_OBJECT
public:
    Button_Dialog(QWidget *parent = 0);

private:
    QPushButton *button1;
    QPushButton *button2;
};

#endif // BUTTON_DIALOG_H



/***********************************************************
                      Button_Dialog.cpp
***********************************************************/
#include 
#include "Button_Dialog.h"

Button_Dialog::Button_Dialog(QWidget *parent) : QDialog (parent)
{
    button1 = new QPushButton;
    button2 = new QPushButton;

    button1->setText("Button1");
    button2->setText("Button2");

    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(button1);
    layout->addWidget(button2);
    setLayout(layout);
}

/***********************************************************
                      main.cpp
***********************************************************/
#include 
#include "Button_Dialog.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Button_Dialog *dia = new Button_Dialog;

    dia->show();
    return app.exec();
}



이렇게 구현을 하였다.

이 4가지 작업 모두 결과를 보게 되면


이 결과화면이 나왔다.

그렇다면, 여기서 궁금한 점은 QWidget과 QDialog은 똑같은 것 같은데,
그차이점이 무엇인지 궁금하다. 그래서 찾아 본 결과
일단 QDialog클래스는 QWidget을 상속 받았다는 것을 QT Class Chart를 본 결과 알게 되었으며,
그리고 Qt프로그래밍(
http://cafe.naver.com/qtprograming)의 매니저인 jsmak님의 답변으로
Dialog에서는 모달과 모달리스를 지원하며, 종료시 accept나 reject를 리턴하게 된다고 하였다.

간단한 소스 분석을 해 보면,

일단,
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(button1);
layout->addWidget(button2);
setLayout(layout);

이 부분이 새로운 부분인데, 여기에서 QHBoxLayout은 말그대로 박스의 배치와 관련된 함수로
출력화면 처럼 가로로 배치를 시키는 함수다.
만약 세로로 배치를 시키고 싶다면, QVBoxLayout를 사용하면 된다.

그리고 addWidget은 말그대로 배치를 시킬 위젯을 추가하는 것이며, 여기에는 나와 있지 않지만,
addLayout이라는 함수는 이미 배치된 레이아웃도 새로운 레이아웃에 추가 시킬 수 있다는 것이다.
그리고 setLayout를 하게 되면, 창에 배치가 되는 것이다.