Qt와 C++를 이용한 학생 정보 관리 시스템

헤더 파일

StudentAdd.h

#pragma once

#include <QtWidgets/QWidget>
#include "ui_StudentAdd.h"

class StudentAdd : public QWidget
{
    Q_OBJECT

public:
    StudentAdd(QWidget *parent = Q_NULLPTR);
    void resetInterface();
    void saveData(QString content);

private:
    Ui::StudentAddClass ui;

private slots:
    void confirmButtonClicked();
    void closeWindow();
};

StudentMainWindow.h

#pragma once

#include <QMainWindow>
#include "ui_StudentMainWindow.h"

#include "StudentSearch.h"
#include "StudentAdd.h"
#include "StudentStatistics.h"
#include <QDebug>

class StudentMainWindow : public QMainWindow
{
    Q_OBJECT

public:
    StudentMainWindow(QWidget *parent = Q_NULLPTR);
    ~StudentMainWindow();

private:
    Ui::StudentMainWindow ui;
private slots:
    void menuActionTriggered(QAction* action);
};

StudentEdit.h

#pragma once

#include <QDialog>
#include "ui_StudentEdit.h"

class StudentEdit : public QDialog
{
    Q_OBJECT

public:
    StudentEdit(QWidget *parent = Q_NULLPTR);
    ~StudentEdit();

private:
    Ui::StudentEdit ui;

private slots:
    void loadButtonClicked();
    void saveButtonClicked();
};

StudentSearch.h

#pragma once

#include <QDialog>
#include "ui_StudentSearch.h"

#include <QFile>
#include <QList>
#include <QString>
#include <QStandardItemModel>
#include <QTextStream>
#include <QMessageBox>
#include <QDebug>

class StudentSearch : public QDialog
{
    Q_OBJECT

public:
    StudentSearch(QWidget *parent = Q_NULLPTR);
    ~StudentSearch();

    int loadDataFile();
    void performSearch(int index, QString keyword);
    void displayResult(int row, QStringList data);

private:
    Ui::StudentSearch ui;
    QList<QString> studentData;
    QStandardItemModel * dataModel;

private slots:
    void searchButtonClicked();
};

StudentStatistics.h

#pragma once

#include <QDialog>
#include "ui_StudentStatistics.h"

#include <QFile>
#include <QList>
#include <QString>
#include <QStandardItemModel>
#include <QTextStream>
#include <QMessageBox>
#include <QDebug>

class StudentStatistics : public QDialog
{
    Q_OBJECT

    int loadDataFile();
    void showAllStudents();
    void displayStudent(int row, QStringList data);

public:
    StudentStatistics(QWidget *parent = Q_NULLPTR);
    ~StudentStatistics();

private:
    Ui::StudentStatistics ui;
    QList<QString> studentData;
    QStandardItemModel * dataModel;

private slots:
    void displayButtonClicked();
};

소스 파일

StudentAdd.cpp

#include <StudentAdd.h>
#include <QString>
#include <QDebug>
#include <QMessageBox>
#include "QPushButton"
#include <QList>
#include <QAbstractButton>
#include <QCheckBox>
#include <QFile>
#include <QTextStream>
#include <QIODevice>

StudentAdd::StudentAdd(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    connect(this->ui.confirmButton, SIGNAL(clicked(bool)), this, SLOT(confirmButtonClicked()));
    connect(this->ui.cancelButton, SIGNAL(clicked(bool)), this, SLOT(closeWindow()));
}

void StudentAdd::confirmButtonClicked()
{
    QString studentName = this->ui.nameInput->text();
    QString studentId = this->ui.idInput->text();
    QString studentYear = this->ui.yearSelect->currentText();
    QString studentGender = this->ui.genderGroup->checkedButton()->text();
    QString studentDepartment = this->ui.departmentSelect->currentText();
    
    QList<QAbstractButton *> interestButtons = this->ui.interestGroup->buttons();
    QString interests;

    int i = 0;
    for (i = 0; i < interestButtons.length(); i++)
    {
        QAbstractButton * checkbox = interestButtons.at(i);
        if (checkbox->isCheckable())
        {
            interests += checkbox->text() + " ";
        }
    }

    QMessageBox messageBox;

    QString contentDisplay =
        u8"이름: " + studentName + '\n'
        + u8"학번: " + studentId + '\n'
        + u8"학년: " + studentYear + '\n'
        + u8"성별: " + studentGender + '\n'
        + u8"학과: " + studentDepartment + '\n'
        + u8"관심사: " + interests;

    QString dataToSave =
        studentName + ' '
        + studentId + ' '
        + studentYear + ' '
        + studentGender + ' '
        + studentDepartment + ' '
        + interests + ' ';


    if (studentName.length() < 1 || studentId.length() < 8 || interests.length() < 1)
    {
        QMessageBox::critical(this, u8"오류", u8"정보가 불완전합니다. 다시 입력해주세요", u8"확인");
    }
    else
    {
        int result = QMessageBox::question(this, u8"정보 확인", contentDisplay, u8"확인", u8"취소");
        if (result == 0)
        {
            resetInterface();
            saveData(dataToSave);
        }
    }
}

void StudentAdd::closeWindow()
{
    this->close();
}

void StudentAdd::resetInterface()
{
    ui.nameInput->clear();
    ui.idInput->clear();
    ui.maleRadio->setChecked(true);
    ui.departmentSelect->setCurrentIndex(0);

    QList<QAbstractButton *> interestButtons = ui.interestGroup->buttons();

    for (int i = 0; i < interestButtons.length(); i++)
    {
        QAbstractButton *checkbox = interestButtons.at(i);
        checkbox->setChecked(false);
    }

    ui.nameInput->setFocus();
}

void StudentAdd::saveData(QString content)
{
    QFile file("StudentData.txt");
    if (!file.open(QIODevice::Append | QIODevice::Text))
    {
        QMessageBox::critical(this, u8"오류", u8"파일 열기 실패", u8"저장되지 않음", u8"확인");
        return;
    }

    QTextStream out(&file);
    out << content << "\n";
}

StudentMainWindow.CPP

#include "StudentMainWindow.h"
#include "StudentAdd.h"
#include "StudentLogin.h"
#include "StudentStatistics.h"
#include "StudentEdit.h"
#include <QFile>

StudentMainWindow::StudentMainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    connect(ui.menuBar, SIGNAL(triggered(QAction*)), this, SLOT(menuActionTriggered(QAction*)));
}

StudentMainWindow::~StudentMainWindow()
{
}

void StudentMainWindow::menuActionTriggered(QAction* action)
{
    if (action->text() == u8"학생 정보 추가")
    {
        StudentAdd *addDialog = new StudentAdd(0);
        addDialog->show();
    }
    else if (action->text() == u8"학생 정보 검색")
    {
        StudentSearch *searchDialog = new StudentSearch(0);
        searchDialog->setWindowFlags(Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);
        searchDialog->setModal(true);
        searchDialog->show();
        searchDialog->exec();
    }
    else if (action->text() == u8"전체 학생 정보")
    {
        StudentStatistics *statsDialog = new StudentStatistics(0);
        statsDialog->setWindowFlags(Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);
        statsDialog->show();
        statsDialog->exec();
    }
    else if (action->text() == u8"학생 정보 수정")
    {
        StudentEdit *editDialog = new StudentEdit(0);
        editDialog->setWindowFlags(Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);
        editDialog->show();
        editDialog->exec();
    }
}

StudentEdit.cpp

#include "StudentEdit.h"
#include <QFile>
#include <QFileDialog>
#include <QString>
#include <QMessageBox>
#include <QTextStream>
#include <QIODevice>
#include <QDebug>
#include <fstream>
#include <string>
#include <iostream>
using namespace std;

#pragma execution_character_set("utf-8")

StudentEdit::StudentEdit(QWidget *parent)
    : QDialog(parent)
{
    ui.setupUi(this);
    connect(ui.loadButton, SIGNAL(clicked()), this, SLOT(loadButtonClicked()));
    connect(ui.saveButton, SIGNAL(clicked()), this, SLOT(saveButtonClicked()));
}

StudentEdit::~StudentEdit()
{
}

void StudentEdit::loadButtonClicked()
{
    QFile file("StudentData.txt");
    
    bool success = file.open(QIODevice::ReadOnly);
    if (success)
    {
        const char* array = file.readAll();
        QString content = QString::fromLocal8Bit(array);
        ui.textEdit->setPlainText(content);
        file.close();
    }
}

void StudentEdit::saveButtonClicked()
{
    QFile file("StudentData.txt");
    
    bool success = file.open(QIODevice::WriteOnly);
    if (success)
    {
        QTextStream out(&file);
        out << ui.textEdit->toPlainText();
        file.close();
    }

    QMessageBox messageBox;
    messageBox.setText(u8"저장되었습니다");
    messageBox.exec();
}

StudentSearch.cpp

#include "StudentSearch.h"
#include <QString>

StudentSearch::StudentSearch(QWidget *parent)
    : QDialog(parent)
{
    ui.setupUi(this);
    connect(ui.searchButton, SIGNAL(clicked()), this, SLOT(searchButtonClicked()));

    if (loadDataFile() == -1)
    {
        QMessageBox::critical(this, "심각한 오류", "파일 열기 실패", "다시 시도하세요!");
        this->close();
    }

    this->dataModel = new QStandardItemModel(0);

    dataModel->setColumnCount(6);
    
    this->dataModel->setHorizontalHeaderItem(0, new QStandardItem(u8"이름"));
    this->dataModel->setHorizontalHeaderItem(1, new QStandardItem(u8"학번"));
    this->dataModel->setHorizontalHeaderItem(2, new QStandardItem(u8"성별"));
    this->dataModel->setHorizontalHeaderItem(3, new QStandardItem(u8"학년"));
    this->dataModel->setHorizontalHeaderItem(4, new QStandardItem(u8"학과"));
    this->dataModel->setHorizontalHeaderItem(5, new QStandardItem(u8"관심사"));

    ui.tableView->setModel(dataModel);
}

StudentSearch::~StudentSearch()
{
}

int StudentSearch::loadDataFile()
{
    QFile file("StudentData.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        return -1;
    }

    QTextStream in(&file);

    while (!in.atEnd())
    {
        QString line = in.readLine();
        studentData.append(line);
    }
    file.close();

    return 0;
}

void StudentSearch::searchButtonClicked()
{
    int searchType = ui.searchMethod->currentIndex();
    QString keyword = ui.searchInput->text();
    performSearch(searchType, keyword);
}

void StudentSearch::performSearch(int index, QString keyword)
{
    int row = 0;
    for (int i = 0; i < studentData.length(); i++)
    {
        QString line = studentData.at(i);
        line = line.trimmed();
        QStringList dataItems = line.split(" ");

        switch (index)
        {
        case 1:
            if (dataItems.at(0).contains(keyword, Qt::CaseSensitive))
            {
                displayResult(row++, dataItems);
            }
            else if (keyword == dataItems.at(0))
            {
                displayResult(row++, dataItems);
            }
            break;
        case 2:
            if (dataItems.at(1).contains(keyword, Qt::CaseSensitive))
            {
                displayResult(row++, dataItems);
            }
            else if (keyword == dataItems.at(1))
            {
                displayResult(row++, dataItems);
            }
            break;
        case 3:
            if (dataItems.at(4).contains(keyword, Qt::CaseSensitive))
            {
                displayResult(row++, dataItems);
            }
            else if (keyword == dataItems.at(4))
            {
                displayResult(row++, dataItems);
            }
            break;
        default:
            break;
        }
    }
}

void StudentSearch::displayResult(int row, QStringList data)
{
    for (int i = 0; i < data.length(); i++)
    {
        this->dataModel->setItem(row, i, new QStandardItem(data.at(i)));
    }
}

StudentStatistics.cpp

#include "StudentStatistics.h"
#include <QString>
#include <QFileDialog>

StudentStatistics::StudentStatistics(QWidget *parent)
    : QDialog(parent)
{
    ui.setupUi(this);
    connect(ui.displayButton, SIGNAL(clicked()), this, SLOT(displayButtonClicked()));

    if (loadDataFile() == -1)
    {
        QMessageBox::critical(this, "심각한 오류", "파일 열기 실패", "다시 시도하세요!");
        this->close();
    }

    this->dataModel = new QStandardItemModel(0);

    dataModel->setColumnCount(6);
    
    this->dataModel->setHorizontalHeaderItem(0, new QStandardItem(u8"이름"));
    this->dataModel->setHorizontalHeaderItem(1, new QStandardItem(u8"학번"));
    this->dataModel->setHorizontalHeaderItem(2, new QStandardItem(u8"학년"));
    this->dataModel->setHorizontalHeaderItem(3, new QStandardItem(u8"성별"));
    this->dataModel->setHorizontalHeaderItem(4, new QStandardItem(u8"학과"));
    this->dataModel->setHorizontalHeaderItem(5, new QStandardItem(u8"관심사"));

    ui.tableView->setModel(dataModel);
}

StudentStatistics::~StudentStatistics()
{
}

int StudentStatistics::loadDataFile()
{
    QFile file("StudentData.txt");
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        return -1;
    }

    QTextStream in(&file);

    while (!in.atEnd())
    {
        QString line = in.readLine();
        studentData.append(line);
    }
    file.close();

    return 0;
}

void StudentStatistics::showAllStudents()
{
    int row = 0;
    for (int i = 0; i < studentData.length(); i++)
    {
        QString line = studentData.at(i);
        line = line.trimmed();
        QStringList dataItems = line.split(" ");

        displayStudent(row++, dataItems);
    }
}

void StudentStatistics::displayStudent(int row, QStringList data)
{
    for (int i = 0; i < data.length(); i++)
    {
        this->dataModel->setItem(row, i, new QStandardItem(data.at(i)));
    }
}

void StudentStatistics::displayButtonClicked()
{
    showAllStudents();
}

Main.cpp

#include <cstdio>
#include <iostream>
#include <string>
#include "StudentInfo.h"
#include "StudentAdd.h"
#include <QtWidgets/QApplication>
#include "QDebug"
#include <StudentMainWindow.h>

using namespace std;

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    
    StudentMainWindow mainWindow;
    mainWindow.show();

    return app.exec();
}

시스템 기능

  • 학생 정보 추가 (이름, 학번, 학년, 성별, 학과, 관심사)
  • 학생 정보 검색 (이름, 학번, 학과별)
  • 전체 학생 정보 조회
  • 학생 정보 수정
  • 데이터 파일 저장 및 불러오기

태그: Qt C++ GUI 학생 정보 관리 파일 입출력

6월 21일 20:05에 게시됨