헤더 파일
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();
}
시스템 기능
- 학생 정보 추가 (이름, 학번, 학년, 성별, 학과, 관심사)
- 학생 정보 검색 (이름, 학번, 학과별)
- 전체 학생 정보 조회
- 학생 정보 수정
- 데이터 파일 저장 및 불러오기