学生管理系统(1:添加学生信息界面)
源码上传至:https://github.com/data1213/QT_Studnt_Manager
添加学生信息界面:
添加学生实现代码:
需求:
1、点击确定按钮时,能够获取当前界面的所有控件的输入信息,在一个新的确认信息界面进行显式,等待确认。
2、在确认界面中,确认ok,点击确定按钮能够将学生信息写入到文件中保存起来,同时,将添加学生信息的界面恢复到初始值状态。
1 /*********addstudents.h********/ 2 #ifndef ADDSTUDENTS_H 3 #define ADDSTUDENTS_H 4 5 #include <QDialog> 6 #include <QButtonGroup> 7 8 namespace Ui { 9 class AddStudents; 10 } 11 12 class AddStudents : public QDialog 13 { 14 Q_OBJECT 15 16 public: 17 explicit AddStudents(QWidget *parent = nullptr); 18 ~AddStudents(); 19 void clear_on_addstudent_ok(); //确认界面点击确定之后,恢复添加学生信息界面的初始值 20 void write_to_file(QString src); //写文件 21 22 private slots: 23 void my_add_students_info_ok_slots(); //添加学生信息界面的确定按钮槽函数 24 void my_add_students_info_cancel_slots();//添加学生信息界面的取消按钮槽函数 25 private: 26 QButtonGroup *sexGroup; //存放性别单选按钮 27 QButtonGroup *habbitGroup; //存放爱好多选按钮 28 Ui::AddStudents *ui; //添加学生信息界面的UI 29 }; 30 31 #endif // ADDSTUDENTS_H
在addstudents.cpp中:
1、首先看构造函数:
1>需要绑定当前界面的按钮与槽函数,需要点击发送信号的有两个按钮:确定按钮+取消按钮
2>对于性别一栏,两个单选按钮,是互斥的,只能选择其中一个,当一个被选中,那么另外一个一定是未选中状态。
3>对于爱好一栏:四个选项是多选的,可以被同时选中、部分被选中、或者都不选。
这里做些支持处理,使其具有单选功能/多选功能,编组——QButtionGroup
1 AddStudents::AddStudents(QWidget *parent) :QDialog(parent),ui(new Ui::AddStudents) 2 { 3 ui->setupUi(this); 4 5 //单选按钮放进组,多选按钮放进组 6 sexGroup = new QButtonGroup(this); 7 sexGroup->addButton(this->ui->rb_male,0); 8 sexGroup->addButton(this->ui->rb_female,1); 9 this->ui->rb_male->setChecked(true); //default 10 11 habbitGroup = new QButtonGroup(this); 12 habbitGroup->addButton(this->ui->cb_1,0); 13 habbitGroup->addButton(this->ui->cb_2,1); 14 habbitGroup->addButton(this->ui->cb_3,2); 15 habbitGroup->addButton(this->ui->cb_4,3); 16 // 设置不互斥 17 habbitGroup->setExclusive(false);//这样的话就支持多选了。 18 19 //连接“确认”按钮到槽函数 20 connect(this->ui->btn_ok,SIGNAL(clicked()),this,SLOT(my_add_students_info_ok_slots())); 21 //连接“取消”按钮到槽函数 22 connect(this->ui->btn_cancel,SIGNAL(clicked()),this,SLOT(my_add_students_info_cancel_slots())); 23 }
点击确定按钮的槽函数:
1>获取当前控件的信息,然后拼接成QString的字符串,
2>由于要在确认界面中进行学生信息显式,所以用'\n'拼接,显式出来更加容易确认,但是这样的拼接不适用文件保存,文件保存的设计想法:一条学生记录,放在一行来完成。这样可以通过readline方法一次性获取。方便后续进行查询。
3>QMessageBox窗口,作为确认界面,响应确定按钮的之后,实现写文件操作+恢复添加学生信息界面默认值,这里可以直接通过返回值类型标识点击的按钮,不用再绑定信号与槽
1 void AddStudents::my_add_students_info_ok_slots(){ 2 3 QString context = ""; //context用来拼接当前界面所有控件的信息 4 5 //获取姓名+学号 6 QString name = this->ui->lineedit_name->text(); 7 QString id = this->ui->lineedit_id->text(); 8 9 context +=name+'\n'+id+'\n'; 10 11 //获取年龄和院系 12 QString age = this->ui->cb_age->currentText(); 13 QString sche = this->ui->cb_sche->currentText(); 14 15 context += age+'\n'+sche+'\n'; 16 17 //获取性别 18 QString sex = this->sexGroup->checkedButton()->text(); 19 20 context += sex+'\n'; 21 22 //获取兴趣,遍历 23 QList<QAbstractButton*> ins_list = habbitGroup->buttons(); 24 QString ins=""; 25 for(int i =0 ;i<ins_list.length();i++) 26 { 27 QAbstractButton *che = ins_list.at(i); 28 if(che->isChecked()) 29 ins += che->text() + " "; 30 } 31 context += ins+'\n'; 32 //检查当前是否姓名,学号,爱好都填写完毕 33 if(context.length() != 0 && name != "" && id !="" && ins.length()!= 0){ 34 int res = QMessageBox::information(this,"请确认信息",context,"确认","取消"); //context用来显示在确认界面 35 if(res == 0){ //点击确定 36 //由于准备采用readline的方式来读取文件,所以不能是用'\n'来拼接字符串,换成' '符号来重新拼接 37 QString src_s = name +' ' + id+' '+sex+' '+sche+' '+age+' '+ins+'\n'; 38 write_to_file(src_s); 39 //恢复添加界面属性值为初始值 40 clear_on_addstudent_ok(); 41 } 42 }else{ //当前是否姓名,学号,爱好有一项未填写就返回错误提示界面 43 44 QMessageBox::critical(this,"请确认信息","信息不完整,请重新输入!","确认","取消"); 45 //重新设置光标位置。这里设置name对应的lineEdit控件获取光标 46 this->ui->lineedit_name->setFocus(); 47 } 48 }
1 //当点击添加学生信息界面的确定之后,需要恢复当前界面的初始值,等待继续添加 2 void AddStudents::clear_on_addstudent_ok(){ 3 //this->ui->lineedit_name->setText(""); 4 this->ui->lineedit_name->clear(); 5 this->ui->lineedit_id->clear(); 6 7 //对于sex的单选框,只需要设置默认为男性就好 8 this->ui->rb_male->setChecked(true); 9 10 //下拉菜单恢复设置 11 this->ui->cb_age->setCurrentIndex(0); 12 this->ui->cb_sche->setCurrentIndex(0); 13 14 //多选框恢复到都未勾选状态 15 QList<QAbstractButton*> ins_list = habbitGroup->buttons(); 16 QString ins; 17 for(int i =0 ;i<ins_list.length();i++) 18 { 19 QAbstractButton *che = ins_list.at(i); 20 che->setChecked(false); 21 } 22 23 //重新设置光标位置。这里设置name对应的lineEdit控件获取光标 24 this->ui->lineedit_name->setFocus(); 25 } 26 27 //保存添加学生信息界面的数据到文本 28 void AddStudents::write_to_file(QString src){ 29 QFile file("stu.txt"); 30 if (!file.open(QIODevice::Append | QIODevice::Text)){ 31 QMessageBox::critical(this,"打开文件错误","确认"); 32 return; 33 } 34 QTextStream out(&file); 35 out << src; 36 } 37 38 //取消按钮的槽函数 39 void AddStudents::my_add_students_info_cancel_slots(){ 40 this->close(); 41 }
进入添加学生信息界面:
填写完整新增学生信息:
确认界面:
点击确认界面的确定之后,添加学生信息的界面恢复默认值:
同时,在当前编译目录下,生成了stu.txt文本
填写学生信息不完整时,弹出错误窗口:
当前知识点:
1> button编组
2> Qfile文件读写
3> QMessagBox窗口以及预定义四种窗口,以及自定义控件、返回值获取
4>Grid layout布局
5>设置光标位置