界面设计
一共有三个界面
主界面
添加学生界面
查询界面
添加学生界面
答题思路是把每个获取每个控件的内容,把他们作为字符串拼接起来,在点击“确定”按钮时如果信息填写完整则存到一个文件中去,保存成功后再恢复默认状态(清除控件的文本或选中)
清除功能
保存成字符串
写入文件
查询界面
设置格式
读取文件
读取之后根据选择的方式进行查询
效果
完整代码
addstu.h
#ifndef ADDSTU_H
#define ADDSTU_H
#include <QDialog>
#include <QApplication>
QT_BEGIN_NAMESPACE
namespace Ui { class AddStu; }
QT_END_NAMESPACE
class AddStu : public QDialog
{
Q_OBJECT
public:
AddStu(QWidget *parent = nullptr);
~AddStu();
void clearUserInterface();
void writeToFile(QString cnt);
private slots:
void on_btn_confirm_clicked();
private:
Ui::AddStu *ui;
};
#endif // ADDSTU_H
addstu.cpp
#include "addstu.h"
#include "ui_addstu.h"
#include <QString>
#include <QDebug>
#include <QMessageBox>
#include <QList>
#include <QAbstractButton>
#include <QFile>
#include <QTextStream>
#include <QIODevice>
#include <QApplication>
AddStu::AddStu(QWidget *parent)
: QDialog(parent)
, ui(new Ui::AddStu)
{
ui->setupUi(this);
connect(ui->btn_cancel, SIGNAL(clicked()), this, SLOT(close()));
}
AddStu::~AddStu()
{
delete ui;
}
void AddStu::clearUserInterface()
{
ui->le_name->clear();
ui->le_id->clear();
ui->rbtn_male->setChecked(false);
ui->rbtn_female->setChecked(false);
ui->cbb_age->setCurrentIndex(1);
ui->cbb_department->setCurrentIndex(0);
QList<QAbstractButton*> ins_list = ui->insGroup->buttons();
for(int i=0; i<ins_list.length(); i++)
ins_list.at(i)->setChecked(false);
ui->le_name->setFocus();
}
void AddStu::on_btn_confirm_clicked()
{
const QString& name = ui->le_name->text();
const QString& id = ui->le_id->text();
if(name.length() < 1 || id.length() < 1) {
QMessageBox::critical(this, "错误","信息填写不完整", "确定");
return;
}
QList<QAbstractButton*> ins_list = ui->insGroup->buttons();
QString ins;
for(int i=0; i<ins_list.length(); i++)
{
if(ins_list.at(i)->isChecked()) {
ins += ins_list.at(i)->text() + ' ';
}
}
QString content = name + 'n' + id;
if(ui->sexGroup->checkedId() != -1) {
QString sex = ui->sexGroup->checkedButton()->text();
content += ('n'+sex);
}
QString age = ui->cbb_age->currentText();
QString department = ui->cbb_department->currentText();
QString sex = ui->sexGroup->checkedButton()->text();
content += 'n' + age + 'n' + department;
content += 'n' + ins;
QString cnt = name + " " + id + " " + sex + " " + age + " " + department + " " + ins + 'n';
if(name.length() < 1 || id.length() < 1 || ins.length() < 1) {
QMessageBox::critical(this, "错误","信息填写不完整", "确定");
}
else {
int ret = QMessageBox::question(this, "请确认信息", content, "确认", "取消");
switch(ret) {
case 0:
clearUserInterface();
writeToFile(cnt);
break;
}
}
}
void AddStu::writeToFile(QString cnt)
{
QFile file("stu.txt");
if(!file.open(QIODevice::Append | QIODevice::Text)) {
QMessageBox::critical(this, "错误", "文件打开失败,信息没有保存,请重试", "确定");
return;
}
QTextStream out(&file);
out << cnt;
file.close();
}
dialog.h(查询界面)
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QFile>
#include <QList>
#include <QString>
#include <QStandardItem>
#include <QStandardItemModel>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = nullptr);
~Dialog();
int readFromFile();
void doQuery(int index,QString cnt);
void display(int row, QStringList subs);
private slots:
void on_btn_search_clicked();
private:
Ui::Dialog *ui;
QList<QString> stu_lines;
QStandardItemModel* model;
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
#include <QFile>
#include <QList>
#include <QTextStream>
#include <QMessageBox>
#include <QDebug>
#include <QStandardItem>
#include <QStandardItemModel>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
if(readFromFile() == -1) {
QMessageBox::critical(this, "严重错误", "文件打开失败,请重试", "确定");
this->close();
}
this->model = new QStandardItemModel;
// 设置表头
this->model->setHorizontalHeaderItem(0, new QStandardItem("姓名"));
this->model->setHorizontalHeaderItem(1, new QStandardItem("学号"));
this->model->setHorizontalHeaderItem(2, new QStandardItem("性别"));
this->model->setHorizontalHeaderItem(3, new QStandardItem("年龄"));
this->model->setHorizontalHeaderItem(4, new QStandardItem("院系"));
this->model->setHorizontalHeaderItem(5, new QStandardItem("兴趣"));
this->ui->tableView->setModel(model);
this->ui->tableView->setColumnWidth(0,100);
this->ui->tableView->setColumnWidth(1,150);
this->ui->tableView->setColumnWidth(2,50);
this->ui->tableView->setColumnWidth(3,50);
this->ui->tableView->setColumnWidth(4,100);
this->ui->tableView->setColumnWidth(5,150);
}
Dialog::~Dialog()
{
delete ui;
}
int Dialog::readFromFile()
{
QFile file("stu.txt");
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
return -1;
QTextStream in(&file);
while(!in.atEnd())
stu_lines.append(in.readLine());
return 1;
file.close();
}
void Dialog::doQuery(int index, QString cnt)
{
int row = 0;
for(int i=0; i<stu_lines.length(); i++)
{
QString line = stu_lines[i];
line = line.trimmed();
QStringList characteristic = line.split(" ");
switch(index)
{
case 1:
if(characteristic[0] == cnt)
display(row++, characteristic);
break;
case 2:
if(characteristic[1] == cnt)
display(row++, characteristic);
break;
case 3:
if(characteristic[4] == cnt)
display(row++, characteristic);
break;
default:
break;
}
}
}
void Dialog::display(int row, QStringList subs)
{
int i;
for(i=0; i<5; i++) {
this->model->setItem(row, i, new QStandardItem(subs[i]));
}
QString ins;
for(i=5; i<subs.length(); i++) {
ins += subs[i] + " ";
}
this->model->setItem(row, 5, new QStandardItem(ins));
}
void Dialog::on_btn_search_clicked()
{
this->model->clear();
this->model->setHorizontalHeaderItem(0, new QStandardItem("姓名"));
this->model->setHorizontalHeaderItem(1, new QStandardItem("学号"));
this->model->setHorizontalHeaderItem(2, new QStandardItem("性别"));
this->model->setHorizontalHeaderItem(3, new QStandardItem("年龄"));
this->model->setHorizontalHeaderItem(4, new QStandardItem("院系"));
this->model->setHorizontalHeaderItem(5, new QStandardItem("兴趣"));
this->ui->tableView->setModel(model);
this->ui->tableView->setColumnWidth(0,100);
this->ui->tableView->setColumnWidth(1,150);
this->ui->tableView->setColumnWidth(2,50);
this->ui->tableView->setColumnWidth(3,50);
this->ui->tableView->setColumnWidth(4,100);
this->ui->tableView->setColumnWidth(5,150);
int index = ui->cbb_method->currentIndex();
QString cnt = ui->le_cnt->text();
doQuery(index, cnt);
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "addstu.h"
#include "dialog.h"
#include <QMainWindow>
#include <QApplication>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_actionAddStudent_triggered();
void on_actionQueryStudent_triggered();
private:
Ui::MainWindow *ui;
AddStu a;
Dialog d;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "addstu.h"
#include <QApplication>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_actionAddStudent_triggered()
{
this->a.show();
}
void MainWindow::on_actionQueryStudent_triggered()
{
this->d.show();
}