본문 바로가기

My Project/교통정리로봇

[교통정리로봇] 프로젝트 문서 4. 구현(첫번째)

 

4. 구  현

(1) UI(User Interface) 구현

파  일  명

설   명

trafficrobot_main.h

프로그램이 시작되는 첫 화면을 구현한 것으로 로그인 화면으로 이동하는 “Enter"버튼과 프로그램을 종료하는 "Exit"버튼을 구현해 놓은 파일

trafficrobot_main.cpp

trafficrobot_check.h

로그인 화면을 구현한 것으로 숫자가 적힌 버튼을 클릭해서 Password를 입력하게 하였고, 로봇을 작동시키기 위한 메뉴화면으로 가는 "Login"버튼과 Password 변경을 위한 "P.W Change"버튼과 이전화면으로 가기 위한 “GoBack"버튼을 구현해 놓은 파일

trafficrobot_check.cpp

trafficrobot_pwchange.h

Password를 변경하는 화면으로 숫자가 적힌 버튼을 클릭해서 Password를 입력하게 하였고, NEW P.W에서 새로운 비밀번호를 입력받고, CHECK P.W에서는 새로운 비밀번호를 한 번 더 확인하도록 구현해 놓은 파일

trafficrobot_pwchange.cpp

trafficrobot_menu.h

로봇을 Automatic Control(자동제어) 할 것인지, Passivity Control(수동제어) 할 것인지를 선택할 수 있도록 구현해 놓은 파일

trafficrobot_menu.cpp

trafficrobot_autocontrol.h

로봇을 자동제어 할 때의 화면으로 로봇의 제어를 시작하기 위한 “START"버튼과 로봇의 제어를 종료하기 위한 ”END"버튼의 구현과 현재의 상태를 보여주는 Label을 구현한 파일

trafficrobot_autocontrol.cpp

trafficrobot_passivitycontrol.h

로봇을 수동제어 할 때의 화면으로 로봇을 작동할 모드를 선태 할 수 있도록 하기 위해 “Mode1"버튼과 ”Mode2"버튼을 구현한 파일

trafficrobot_passivitycontrol.cpp

serial.h

AVR과 통신을 하기 위한 터미널 속성을 정의 해 놓은 파일

serial.cpp




main.cpp

#include <qapplication.h>

#include "trafficrobot_main.h"

int main( int argc, char ** argv )

{

    QApplication app( argc, argv );

    TrafficRobot_Main TR;

    TR.show();

    app.connect( &app, SIGNAL( lastWindowClosed() ), &app, SLOT( quit() ) );

    return app.exec();

}

 

trafficrobot_main.h

#ifndef TRAFFICROBOT_MAIN_H

#define TRAFFICROBOT_MAIN_H

#include <qvariant.h>

#include <qdialog.h>

class QVBoxLayout;

class QHBoxLayout;

class QGridLayout;

class QSpacerItem;

class QPushButton;

class TrafficRobot_Main : public QDialog

{

    Q_OBJECT

    // 시그널 또는 슬롯을 갖는 모든 클래스는 자신의 클래스 안에 비공개로 Q_OBJECT를 기술해야 함.

       만약 이것을 기술하지 않으면 시그널과 슬롯 처리가 제대로 되지 않음.

public:

    TrafficRobot_Main( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl =

    Qt::WStyle_Customize | Qt::WStyle_NoBorder ); // 실행창을 전체화면으로 보여주도록 설정

    ~TrafficRobot_Main();

    QPushButton* button_Exit; // 종료버튼

    QPushButton* button_Enter; // 시작버튼

protected:

protected slots:

    virtual void languageChange(); // Form의 caption 및 버튼의 이름을 변경하는 함수

private slots:

    virtual void ShowCheckForm();

    // CheckForm 으로 이동하는 함수. 즉, Enter버튼을 클릭 했을 때 다음화면을 보여주는 함수

};

#endif // TRAFFICROBOT_MAIN_H

trafficrobot_main.cpp

#include "trafficrobot_main.h"

#include "trafficrobot_check.h"

#include <qvariant.h>

#include <qpushbutton.h>

#include <qlayout.h>

#include <qtooltip.h>

#include <qwhatsthis.h>

#include <qimage.h>

#include <qpixmap.h>

TrafficRobot_Main::TrafficRobot_Main( QWidget* parent, const char* name, bool modal, WFlags fl )

    : QDialog( parent, name, modal, fl )

{

    if ( !name )

        setName( "TrafficRobot_Main" ); // Form의 이름 설정

    setPaletteBackgroundPixmap( QPixmap::fromMimeSource( "LOGO_.png" ) );

    // Form의 배경 이미지 설정

    button_Exit = new QPushButton( this, "button_Exit" ); // Exit 버튼의 생성 및 이름 설정

    button_Exit->setGeometry( QRect( 130, 120, 80, 30 ) ); // Exit 버튼의 크기 및 위치 설정

    button_Exit->setPaletteBackgroundColor( QColor( 234, 255, 250 ) ); // Exit 버튼 배경색 설정

    QFont button_Exit_font(  button_Exit->font() );

    button_Exit_font.setFamily( "DejaVu LGC Sans Mono" ); // Exit 버튼의 글꼴 설정

    button_Exit_font.setPointSize( 12 ); // Exit 버튼의 글씨 크기 설정

    button_Exit_font.setBold( TRUE ); // Exit 버튼의 글꼴 효과(굵게) 설정

    button_Exit->setFont( button_Exit_font ); // Exit 버튼의 글꼴을 button_Exit_font로 설정

    button_Enter = new QPushButton( this, "button_Enter" ); // Enter 버튼의 생성 및 이름 설정

    button_Enter->setGeometry( QRect( 30, 120, 81, 31 ) ); // Enter 버튼의 크기 및 위치 설정

    button_Enter->setPaletteBackgroundColor( QColor( 234, 255, 250 ) );

    // Enter 버튼의 배경색 설정

    QFont button_Enter_font(  button_Enter->font() );

    button_Enter_font.setFamily( "DejaVu LGC Sans Mono" ); // Enter 버튼의 글꼴 설정

    button_Enter_font.setPointSize( 12 ); // Enter 버튼의 글씨 크기 설정

    button_Enter_font.setBold( TRUE ); // Enter 버튼의 글꼴 효과(굵게) 설정

    button_Enter->setFont( button_Enter_font ); // Enter 버튼의 글꼴을 button_Enter_font로 설정

 

trafficrobot_main.cpp

    languageChange();

    resize( QSize(240, 320).expandedTo(minimumSizeHint()) ); // 실행창의 크기 설정

    clearWState( WState_Polished );

        connect( button_Exit, SIGNAL( clicked() ), this, SLOT( close() ) );

    // Exit 버튼을 클릭(이벤트 발생)하면 현재창이 닫히도록 설정

    connect( button_Enter, SIGNAL( clicked() ), this, SLOT( ShowCheckForm() ) );

    // Enter 버튼을 클릭(이벤트 발생)하면 다음 화면(Check Form), 즉 로그인 화면이 나오도록 설정

}

TrafficRobot_Main::~TrafficRobot_Main()

{

}

void TrafficRobot_Main::languageChange()

{

    setCaption( tr( "TrafficRobot_Main" ) ); // 실행 Form의 Caption 설정

    button_Exit->setText( tr( "Exit" ) );  // Exit 버튼의 text(표시되는 내용) 설정

    button_Enter->setText( tr( "Enter" ) ); // Enter 버튼의 text(표시되는 내용) 설정

}

void TrafficRobot_Main::ShowCheckForm()

// 다음 화면(Check Form으로 로그인 화면)으로 이동하는 함수

{

    TrafficRobot_Check check(this);

   

    check.exec();

}

 

trafficrobot_check.h

#ifndef TRAFFICROBOT_CHECK_H

#define TRAFFICROBOT_CHECK_H

#include <qvariant.h>

#include <qdialog.h>

class QVBoxLayout;

class QHBoxLayout;

class QGridLayout;

class QSpacerItem;

class QLabel;

class QPushButton;

class QLineEdit;

class TrafficRobot_Check : public QDialog

{

    Q_OBJECT

public:

    TrafficRobot_Check( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = Qt::WStyle_Customize | Qt::WStyle_NoBorder );

    ~TrafficRobot_Check();

    QLabel* Label_PW; // 'PASSWORD :'를 표시하는 Label

    QLineEdit* input_pw; // Password를 입력받을 LineEdit

    QPushButton* button_num0; // Password를 입력할 때 LineEdit에‘0’을 입력할 버튼

    QPushButton* button_num1; // Password를 입력할 때 LineEdit에‘1’을 입력할 버튼

    QPushButton* button_num2; // Password를 입력할 때 LineEdit에‘2’를 입력할 버튼

    QPushButton* button_num3; // Password를 입력할 때 LineEdit에‘3’을 입력할 버튼

    QPushButton* button_num4; // Password를 입력할 때 LineEdit에‘4’를 입력할 버튼

    QPushButton* button_num5; // Password를 입력할 때 LineEdit에‘5’를 입력할 버튼

    QPushButton* button_num6; // Password를 입력할 때 LineEdit에‘6’을 입력할 버튼

    QPushButton* button_num7; // Password를 입력할 때 LineEdit에‘7’을 입력할 버튼

    QPushButton* button_num8; // Password를 입력할 때 LineEdit에‘8’을 입력할 버튼

    QPushButton* button_num9; // Password를 입력할 때 LineEdit에‘9’를 입력할 버튼

    QPushButton* button_Login; // Login을 하기 위한 버튼

    QPushButton* button_goback1; // 이전 화면으로 이동하기 위한 버튼

    QPushButton* button_numback; // 입력한 Password를 한 글자 지울 때 사용하는 버튼

    QPushButton* button_pwchange; // Password를 수정하고자 할 때 사용할 버튼

 

trafficrobot_check.h

public slots:

    virtual void PW_num1(); // Password를 입력할 때 LineEdit에‘1’을 입력하기 위한 함수

    virtual void PW_num2(); // Password를 입력할 때 LineEdit에‘2’를 입력하기 위한 함수

    virtual void PW_num3(); // Password를 입력할 때 LineEdit에‘3’을 입력하기 위한 함수

    virtual void PW_num4(); // Password를 입력할 때 LineEdit에‘4’를 입력하기 위한 함수

    virtual void PW_num5(); // Password를 입력할 때 LineEdit에‘5’를 입력하기 위한 함수

    virtual void PW_num6(); // Password를 입력할 때 LineEdit에‘6’을 입력하기 위한 함수

    virtual void PW_num7(); // Password를 입력할 때 LineEdit에‘7’을 입력하기 위한 함수

    virtual void PW_num8(); // Password를 입력할 때 LineEdit에‘8’을 입력하기 위한 함수

    virtual void PW_num9(); // Password를 입력할 때 LineEdit에‘9’를 입력하기 위한 함수

    virtual void PW_num0(); // Password를 입력할 때 LineEdit에‘0’을 입력하기 위한 함수

    virtual void PW_backspace(); // 입력한 Password를 한 글자 지우는 함수

    virtual void PW_Login(); // Login을 위해 파일의 암호와 입력한 암호를 비교하는 함수

    virtual void PW_change(); // Login 후에 Password를 바꿔주는 함수

protected:

protected slots:

    virtual void languageChange();

};

#endif // TRAFFICROBOT_CHECK_H

 

trafficrobot_check.cpp

#include "trafficrobot_check.h"

#include "trafficrobot_menu.h"

#include "trafficrobot_pwchange.h"

#include <qvariant.h>

#include <qlabel.h>

#include <qpushbutton.h>

#include <qlineedit.h>

#include <qlayout.h>

#include <qtooltip.h>

#include <qwhatsthis.h>

#include <qimage.h>

#include <qpixmap.h>

#include <stdio.h>

#include <string.h>

char password_input[5] = {0,}; // 사용자로부터 입력받은 Password를 저장할 배열

TrafficRobot_Check::TrafficRobot_Check( QWidget* parent, const char* name, bool modal, WFlags fl )

    : QDialog( parent, name, modal, fl )

{

    if ( !name )

        setName( "TrafficRobot_Check" ); // Form의 이름 설정

    setPaletteBackgroundPixmap( QPixmap::fromMimeSource( "LOGO3_.png" ) );

    // Form의 배경 이미지 설정

    Label_PW = new QLabel( this, "Label_PW" ); // Label 생성 및 이름 설정

    Label_PW->setGeometry( QRect( 10, 80, 110, 20 ) ); // Label의 크기 및 위치 설정

    Label_PW->setPaletteBackgroundColor( QColor( 137, 255, 239 ) ); // Label의 배경색 설정

    QFont Label_PW_font(  Label_PW->font() );

    Label_PW_font.setFamily( "DejaVu LGC Sans Mono" ); // Label에 표시될 내용의 글꼴 설정

    Label_PW_font.setPointSize( 12 ); // Label에 표시될 내용의 글꼴 크기 설정

    Label_PW_font.setBold( TRUE ); // Label에 표시될 내용의 글꼴 효과(굵게) 설정

    Label_PW->setFont( Label_PW_font ); // Label에 표시될 내용의 글꼴을 Label_PW_font로 설정

    button_num7 = new QPushButton( this, "button_num7" ); // PushButton 생성 및 이름 설정

    button_num7->setGeometry( QRect( 51, 153, 30, 30 ) ); // 버튼의 위치 및 크기 설정

    button_num7->setPaletteBackgroundColor( QColor( 234, 255, 250 ) ); // 버튼의 배경색 설정

    QFont button_num7_font(  button_num7->font() );

    button_num7_font.setFamily( "DejaVu LGC Sans Mono" ); // 버튼의 글꼴 설정

    button_num7_font.setPointSize( 12 ); // 버튼의 글꼴 크기 설정

    button_num7_font.setBold( TRUE ); // 버튼의 글꼴 효과(굵게) 설정

    button_num7->setFont( button_num7_font ); // 버튼의 글꼴을 button_num7_font로 설정

 

trafficrobot_check.cpp

    button_num9 = new QPushButton( this, "button_num9" );

    button_num9->setGeometry( QRect( 123, 153, 30, 30 ) );

    button_num9->setPaletteBackgroundColor( QColor( 234, 255, 250 ) );

    QFont button_num9_font(  button_num9->font() );

    button_num9_font.setFamily( "DejaVu LGC Sans Mono" );

    button_num9_font.setPointSize( 12 );

    button_num9_font.setBold( TRUE );

    button_num9->setFont( button_num9_font );

    button_num6 = new QPushButton( this, "button_num6" );

    button_num6->setGeometry( QRect( 15, 153, 30, 30 ) );

    button_num6->setPaletteBackgroundColor( QColor( 234, 255, 250 ) );

    QFont button_num6_font(  button_num6->font() );

    button_num6_font.setFamily( "DejaVu LGC Sans Mono" );

    button_num6_font.setPointSize( 12 );

    button_num6_font.setBold( TRUE );

    button_num6->setFont( button_num6_font );

    button_num8 = new QPushButton( this, "button_num8" );

    button_num8->setGeometry( QRect( 87, 153, 30, 30 ) );

    button_num8->setPaletteBackgroundColor( QColor( 234, 255, 250 ) );

    QFont button_num8_font(  button_num8->font() );

    button_num8_font.setFamily( "DejaVu LGC Sans Mono" );

    button_num8_font.setPointSize( 12 );

    button_num8_font.setBold( TRUE );

    button_num8->setFont( button_num8_font );

    button_goback1 = new QPushButton( this, "button_goback1" );

    button_goback1->setGeometry( QRect( 68, 260, 100, 30 ) );

    button_goback1->setPaletteBackgroundColor( QColor( 234, 255, 250 ) );

    QPalette pal;

    QColorGroup cg;

    cg.setColor( QColorGroup::Foreground, black );

    cg.setColor( QColorGroup::Button, QColor( 234, 255, 250) );

    cg.setColor( QColorGroup::Light, white );

    cg.setColor( QColorGroup::Midlight, QColor( 244, 255, 252) );

    cg.setColor( QColorGroup::Dark, QColor( 117, 127, 125) );

    cg.setColor( QColorGroup::Mid, QColor( 156, 170, 167) );

    cg.setColor( QColorGroup::Text, black );

    cg.setColor( QColorGroup::BrightText, white );

    cg.setColor( QColorGroup::ButtonText, black );

trafficrobot_check.cpp

    cg.setColor( QColorGroup::Base, white );

    cg.setColor( QColorGroup::Background, QColor( 179, 249, 249) );

    cg.setColor( QColorGroup::Shadow, black );

    cg.setColor( QColorGroup::Highlight, QColor( 0, 0, 128) );

    cg.setColor( QColorGroup::HighlightedText, white );

    cg.setColor( QColorGroup::Link, black );

    cg.setColor( QColorGroup::LinkVisited, black );

    pal.setActive( cg );

    cg.setColor( QColorGroup::Foreground, black );

    cg.setColor( QColorGroup::Button, QColor( 234, 255, 250) );

    cg.setColor( QColorGroup::Light, white );

    cg.setColor( QColorGroup::Midlight, white );

    cg.setColor( QColorGroup::Dark, QColor( 117, 127, 125) );

    cg.setColor( QColorGroup::Mid, QColor( 156, 170, 167) );

    cg.setColor( QColorGroup::Text, black );

    cg.setColor( QColorGroup::BrightText, white );

    cg.setColor( QColorGroup::ButtonText, black );

    cg.setColor( QColorGroup::Base, white );

    cg.setColor( QColorGroup::Background, QColor( 179, 249, 249) );

    cg.setColor( QColorGroup::Shadow, black );

    cg.setColor( QColorGroup::Highlight, QColor( 0, 0, 128) );

    cg.setColor( QColorGroup::HighlightedText, white );

    cg.setColor( QColorGroup::Link, QColor( 0, 0, 255) );

    cg.setColor( QColorGroup::LinkVisited, QColor( 255, 0, 255) );

    pal.setInactive( cg );

    cg.setColor( QColorGroup::Foreground, QColor( 128, 128, 128) );

    cg.setColor( QColorGroup::Button, QColor( 234, 255, 250) );

    cg.setColor( QColorGroup::Light, white );

    cg.setColor( QColorGroup::Midlight, white );

    cg.setColor( QColorGroup::Dark, QColor( 117, 127, 125) );

    cg.setColor( QColorGroup::Mid, QColor( 156, 170, 167) );

    cg.setColor( QColorGroup::Text, QColor( 128, 128, 128) );

    cg.setColor( QColorGroup::BrightText, white );

    cg.setColor( QColorGroup::ButtonText, QColor( 128, 128, 128) );

    cg.setColor( QColorGroup::Base, white );

    cg.setColor( QColorGroup::Background, QColor( 179, 249, 249) );

    cg.setColor( QColorGroup::Shadow, black );

    cg.setColor( QColorGroup::Highlight, QColor( 0, 0, 128) );

    cg.setColor( QColorGroup::HighlightedText, white );

    cg.setColor( QColorGroup::Link, QColor( 0, 0, 255) );

    cg.setColor( QColorGroup::LinkVisited, QColor( 255, 0, 255) );

    pal.setDisabled( cg );

    button_goback1->setPalette( pal );

    QFont button_goback1_font(  button_goback1->font() );

trafficrobot_check.cpp

    button_goback1_font.setFamily( "DejaVu LGC Sans Mono" );

    button_goback1_font.setPointSize( 12 );

    button_goback1_font.setBold( TRUE );

    button_goback1->setFont( button_goback1_font );

    button_num0 = new QPushButton( this, "button_num0" );

    button_num0->setGeometry( QRect( 159, 153, 30, 30 ) );

    button_num0->setPaletteBackgroundColor( QColor( 234, 255, 250 ) );

    QFont button_num0_font(  button_num0->font() );

    button_num0_font.setFamily( "DejaVu LGC Sans Mono" );

    button_num0_font.setPointSize( 12 );

    button_num0_font.setBold( TRUE );

    button_num0->setFont( button_num0_font );

    button_numback = new QPushButton( this, "button_numback" );

    button_numback->setGeometry( QRect( 195, 115, 30, 68 ) );

    button_numback->setPaletteBackgroundColor( QColor( 234, 255, 250 ) );

    button_numback->setPaletteBackgroundPixmap( QPixmap::fromMimeSource( "back1.png" ) );

    QFont button_numback_font(  button_numback->font() );

    button_numback_font.setFamily( "DejaVu LGC Sans Mono" );

    button_numback_font.setPointSize( 18 );

    button_numback_font.setBold( TRUE );

    button_numback->setFont( button_numback_font );

    button_num1 = new QPushButton( this, "button_num1" );

    button_num1->setGeometry( QRect( 15, 115, 30, 30 ) );

    button_num1->setPaletteBackgroundColor( QColor( 234, 255, 250 ) );

    QFont button_num1_font(  button_num1->font() );

    button_num1_font.setFamily( "DejaVu LGC Sans Mono" );

    button_num1_font.setPointSize( 12 );

    button_num1_font.setBold( TRUE );

    button_num1->setFont( button_num1_font );

    button_num2 = new QPushButton( this, "button_num2" );

    button_num2->setGeometry( QRect( 51, 115, 30, 30 ) );

    button_num2->setPaletteBackgroundColor( QColor( 234, 255, 250 ) );

    QFont button_num2_font(  button_num2->font() );

    button_num2_font.setFamily( "DejaVu LGC Sans Mono" );

    button_num2_font.setPointSize( 12 );

    button_num2_font.setBold( TRUE );

    button_num2->setFont( button_num2_font );

    button_num3 = new QPushButton( this, "button_num3" );

    button_num3->setGeometry( QRect( 87, 115, 30, 30 ) );

trafficrobot_check.cpp

    button_num3->setPaletteBackgroundColor( QColor( 234, 255, 250 ) );

    QFont button_num3_font(  button_num3->font() );

    button_num3_font.setFamily( "DejaVu LGC Sans Mono" );

    button_num3_font.setPointSize( 12 );

    button_num3_font.setBold( TRUE );

    button_num3->setFont( button_num3_font );

    button_num4 = new QPushButton( this, "button_num4" );

    button_num4->setGeometry( QRect( 123, 115, 30, 30 ) );

    button_num4->setPaletteBackgroundColor( QColor( 234, 255, 250 ) );

    QFont button_num4_font(  button_num4->font() );

    button_num4_font.setFamily( "DejaVu LGC Sans Mono" );

    button_num4_font.setPointSize( 12 );

    button_num4_font.setBold( TRUE );

    button_num4->setFont( button_num4_font );

    button_num5 = new QPushButton( this, "button_num5" );

    button_num5->setGeometry( QRect( 159, 115, 30, 30 ) );

    button_num5->setPaletteBackgroundColor( QColor( 234, 255, 250 ) );

    QFont button_num5_font(  button_num5->font() );

    button_num5_font.setFamily( "DejaVu LGC Sans Mono" );

    button_num5_font.setPointSize( 12 );

    button_num5_font.setBold( TRUE );

    button_num5->setFont( button_num5_font );

    button_pwchange = new QPushButton( this, "button_pwchange" );

    button_pwchange->setGeometry( QRect( 130, 200, 100, 30 ) );

    button_pwchange->setPaletteBackgroundColor( QColor( 234, 255, 250 ) );

    QFont button_pwchange_font(  button_pwchange->font() );

    button_pwchange_font.setFamily( "DejaVu LGC Sans Mono" );

    button_pwchange_font.setPointSize( 11 );

    button_pwchange_font.setBold( TRUE );

    button_pwchange->setFont( button_pwchange_font );

    input_pw = new QLineEdit( this, "input_pw" );

    input_pw->setGeometry( QRect( 120, 80, 110, 23 ) );

    QFont input_pw_font(  input_pw->font() );

    input_pw_font.setFamily( "DejaVu LGC Sans Mono" );

    input_pw_font.setPointSize( 11 );

    input_pw_font.setBold( TRUE );

    input_pw->setFont( input_pw_font );

    input_pw->setEchoMode( QLineEdit::Normal );

    input_pw->setAlignment( int( QLineEdit::AlignLeft ) );

 

trafficrobot_check.cpp

    button_Login = new QPushButton( this, "button_Login" );

    button_Login->setGeometry( QRect( 10, 200, 100, 30 ) );

    button_Login->setPaletteBackgroundColor( QColor( 234, 255, 250 ) );

    QFont button_Login_font(  button_Login->font() );

    button_Login_font.setFamily( "DejaVu LGC Sans Mono" );

    button_Login_font.setPointSize( 12 );

    button_Login_font.setBold( TRUE );

    button_Login->setFont( button_Login_font );

    languageChange();

    resize( QSize(240, 320).expandedTo(minimumSizeHint()) ); // 실행 Form의 크기 설정

    clearWState( WState_Polished );

    connect( button_goback1, SIGNAL( clicked() ), this, SLOT( close() ) );

    // GoBack 버튼을 클릭(이벤트 발생)하면 현재창이 닫히도록 설정

    connect( button_num1, SIGNAL( clicked() ), this, SLOT( PW_num1() ) );

    // ‘1’버튼을 클릭(이벤트 발생)하면 LineEdit에 ‘1’이 입력되도록 설정

    connect( button_num2, SIGNAL( clicked() ), this, SLOT( PW_num2() ) );

    connect( button_num3, SIGNAL( clicked() ), this, SLOT( PW_num3() ) );

    connect( button_num4, SIGNAL( clicked() ), this, SLOT( PW_num4() ) );

    connect( button_num5, SIGNAL( clicked() ), this, SLOT( PW_num5() ) );

    connect( button_num6, SIGNAL( clicked() ), this, SLOT( PW_num6() ) );

    connect( button_num7, SIGNAL( clicked() ), this, SLOT( PW_num7() ) );

    connect( button_num8, SIGNAL( clicked() ), this, SLOT( PW_num8() ) );

    connect( button_num9, SIGNAL( clicked() ), this, SLOT( PW_num9() ) );

    connect( button_num0, SIGNAL( clicked() ), this, SLOT( PW_num0() ) );

    connect( button_numback, SIGNAL( clicked() ), this, SLOT( PW_backspace() ) );

    // ‘←’버튼을 클릭하면 LineEdit에 입력된 Password를 한 글자 지우도록 설정

    connect( button_Login, SIGNAL( clicked() ), this, SLOT( PW_Login() ) );

    // Login 버튼을 클릭하면 파일에 저장된 암호와 사용자 입력 암호를 비교하도록 설정

    connect( button_pwchange, SIGNAL( clicked() ), this, SLOT( PW_change() ) );

    // P.W Change 버튼을 클릭하면 암호를 수정할 수 있도록 설정

}

TrafficRobot_Check::~TrafficRobot_Check()

{

}

void TrafficRobot_Check::languageChange()

{

    setCaption( tr( "TrafficRobot_Check" ) ); // 현재 Form의 Caption 설정

    Label_PW->setText( tr( "PASSWORD :" ) ); // Label에 표시될 내용 설정

   

    button_num0->setText( tr( "0" ) ); // 버튼에 표시될 내용 설정

    button_num1->setText( tr( "1" ) );

trafficrobot_check.cpp

    button_num2->setText( tr( "2" ) );

    button_num3->setText( tr( "3" ) );

    button_num4->setText( tr( "4" ) );

    button_num5->setText( tr( "5" ) );

    button_num6->setText( tr( "6" ) );

    button_num7->setText( tr( "7" ) );

    button_num8->setText( tr( "8" ) );

    button_num9->setText( tr( "9" ) );

    button_Login->setText( tr( "Login" ) );

    button_goback1->setText( tr( "Go Back" ) );

    button_pwchange->setText( tr( "P.W Change" ) );

}

void TrafficRobot_Check::PW_num1()

{

    int str_pw; // 사용자로부터 입력받은 암호의 길이

   

    input_pw->setEchoMode(QLineEdit::Password);

    // LineEdit의 속성 설정(암호이기 때문에 ‘*’로 표시되도록 설정)

   

    str_pw = strlen(password_input); // 사용자가 입력한 암호의 길이를 str_pw에 저장

   

    if(str_pw < 5) // 만약 사용자가 입력한 암호가 5자리 미만이라면(5자리만 입력되도록 제한)

    {

        password_input[str_pw] = '1'; // 암호를 저장할 배열에 ‘1’을 저장

    }

    input_pw->setText(tr(password_input)); // LineEdit에 password_input에 저장된 배열 표시

}

void TrafficRobot_Check::PW_num2()

{

    int str_pw;

   

    input_pw->setEchoMode(QLineEdit::Password);

   

    str_pw = strlen(password_input);

   

    if(str_pw < 5)

    {

        password_input[str_pw] = '2';

    }

 

    input_pw->setText(tr(password_input));

}

trafficrobot_check.cpp

void TrafficRobot_Check::PW_num3()

{

    int str_pw;

   

    input_pw->setEchoMode(QLineEdit::Password);

   

    str_pw = strlen(password_input);

   

    if(str_pw < 5)

    {

        password_input[str_pw] = '3';

    }

    input_pw->setText(tr(password_input));

}

void TrafficRobot_Check::PW_num4()

{

    int str_pw;

   

    input_pw->setEchoMode(QLineEdit::Password);

   

    str_pw = strlen(password_input);

   

    if(str_pw < 5)

    {

        password_input[str_pw] = '4';

    }

    input_pw->setText(tr(password_input));

}

void TrafficRobot_Check::PW_num5()

{

    int str_pw;

   

    input_pw->setEchoMode(QLineEdit::Password);

   

    str_pw = strlen(password_input);

   

    if(str_pw < 5)

    {

        password_input[str_pw] = '5';

    }

    input_pw->setText(tr(password_input));

}

trafficrobot_check.cpp

void TrafficRobot_Check::PW_num6()

{

    int str_pw;

   

    input_pw->setEchoMode(QLineEdit::Password);

   

    str_pw = strlen(password_input);

   

    if(str_pw < 5)

    {

        password_input[str_pw] = '6';

    }

    input_pw->setText(tr(password_input));

}

void TrafficRobot_Check::PW_num7()

{

    int str_pw;

   

    input_pw->setEchoMode(QLineEdit::Password);

   

    str_pw = strlen(password_input);

   

    if(str_pw < 5)

    {

        password_input[str_pw] = '7';

    }

    input_pw->setText(tr(password_input));

}

void TrafficRobot_Check::PW_num8()

{

    int str_pw;

    input_pw->setEchoMode(QLineEdit::Password);

   

    str_pw = strlen(password_input);

   

    if(str_pw < 5)

    {

        password_input[str_pw] = '8';

    }

    input_pw->setText(tr(password_input));

}

void TrafficRobot_Check::PW_num9()

{

    int str_pw;

   

    input_pw->setEchoMode(QLineEdit::Password);

   

    str_pw = strlen(password_input);

   

    if(str_pw < 5)

    {

        password_input[str_pw] = '9';

    }

    input_pw->setText(tr(password_input));

}

trafficrobot_check.cpp

void TrafficRobot_Check::PW_num0()

{

    int str_pw;

   

    input_pw->setEchoMode(QLineEdit::Password);

   

    str_pw = strlen(password_input);

   

    if(str_pw < 5)

    {

        password_input[str_pw] = '0';

    }

    input_pw->setText(tr(password_input));

}

void TrafficRobot_Check::PW_backspace()

{

    int str_pw; // 사용자로부터 입력받은 암호의 길이

   

    str_pw = strlen(password_input); // 사용자가 입력한 암호의 길이를 str_pw에 저장

   

    if(str_pw > 0 && str_pw < 6 ) // 사용자가 입력한 암호의 길이가 0~6이라면

    {

        password_input[str_pw-1] = '\0';

        // password_input배열의 str_pw-1번째(str_pw번째는 Null문자이기 때문)에 ‘\0’문자 입력

    }

   

    input_pw->setText(tr(password_input)); // LineEdit에 password_input에 저장된 배열 표시

}

void TrafficRobot_Check::PW_Login() // 로그인을 위한 함수

{

    FILE *file1; // File open을 위한 변수

   

    char password[5] = {0, }; // 파일에 저장된(읽어 올) 암호(비밀번호)

    int len=0, pass_cmp_login=0;

    // len : 파일에서 읽어온 문자열의 길이를 저장하기 위한 변수

    // pass_cmp_login : 파일에서 읽어온 암호와 사용자가 입력한 암호를 비교하고 그 결과를 저장할                  변수

   

    file1 = fopen("file.bin", "rb"); // 암호가 적힌 파일 열기

   

    if(file1 != NULL) // 파일이 정상적으로 열어졌다면

    {

        fseek(file1, 0L, SEEK_END); // 파일에서 커서를 제일 끝으로 이동

        len = ftell(file1); // 파일의 길이를 len에 저장(ftell()은 파일의 길이를 구하는 함수)

               

        fseek(file1, 0L, SEEK_SET); // 파일에서 커서를 제일 처음(앞)으로 이동

        fread(password, 1, len, file1); // 파일에서 읽어온 문자열을 password에 저장

        fclose(file1); // 파일 닫기

    }

   

trafficrobot_check.cpp

    pass_cmp_login = strcmp(password_input, password);

    // 사용자가 입력한 암호와 파일에서 읽어온 암호 비교

    if(pass_cmp_login == 0) // 만약 비교한 결과가 ‘0’이라면(일치한다면)

    {

        TrafficRobot_Menu menu(this); // 다음(메뉴)화면으로 이동

   

        for(int i = 0; i < 5; i++) // 사용자가 입력한 암호를 저장하는 배열을 초기화

        {

            password_input[i] = '\0';

        }

        menu.exec();

       

        close(); // 현재화면(CheckForm) 닫기

    }

    else // 사용자가 입력한 암호와 파일에서 읽어온 암호가 일치하지 않는다면

    {

        input_pw->setEchoMode(QLineEdit::Normal); // LineEdit에 글자로 보이도록 설정

        input_pw->setText("Login error"); // LineEdit에 “Login error" 출력

               

        for(int i = 0; i < 5; i++) // 사용자가 입력한 암호를 저장하는 배열 초기화

        {

            password_input[i] = '\0';

        }

    }

}

void TrafficRobot_Check::PW_change() // 암호 변경을 위한 함수

{

    FILE *file1;

   

    char password[5] = {0, }; // 파일에서 읽어올 암호를 저장할 배열

    int len=0, pass_cmp_login=0;

    // len : 파일에서 읽어온 문자열의 길이를 저장하기 위한 변수

    // pass_cmp_login : 파일에서 읽어온 암호와 사용자가 입력한 암호를 비교하고 그 결과를 저장할                  변수

   

    file1 = fopen("file.bin", "rb"); // 암호가 저장된 파일 열기

   

trafficrobot_check.cpp

    if(file1 != NULL) // 파일이 정상적으로 열어졌다면

    {

        fseek(file1, 0L, SEEK_END); // 파일에서 커서를 제일 끝으로 이동

        len = ftell(file1); // 파일의 길이를 len에 저장

               

        fseek(file1, 0L, SEEK_SET); // 파일의 커서를 제일 처음으로 디오

        fread(password, 1, len, file1); // 파일에서 읽어온 문자열을 password에 저장

        fclose(file1); // 파일 닫기

    }

   

    pass_cmp_login = strcmp(password_input, password);

    // 사용자가 입력한 암호와 파일에서 읽어온 암호를 비교

    if(pass_cmp_login == 0) // 비교한 결과가 ‘0’이라면(일치한다면)

    {

        TrafficRobot_PWchange pwchange(this); // 다음(암호변경)으로 이동

   

        for(int i = 0; i < 5; i++) // 사용자가 입력한 암호를 저장한 배열 초기화

        {

            password_input[i] = '\0';

        }

        pwchange.exec(); 

        close(); // 현재창(PWchange)닫기

    }

    else // 사용자가 입력한 암호와 파일에서 읽어온 암호가 일치하지 않는다면

    {

        input_pw->setEchoMode(QLineEdit::Normal); // LineEdit에 글자로 보이도록 설정

        input_pw->setText("Login error"); // LineEdit에 “Login error" 출력

               

        for(int i = 0; i < 5; i++) // 사용자가 입력한 암호가 저장된 배열 초기화

        {

            password_input[i] = '\0';

        }

    }

}