Qt学习
学生管理系统第一部分
- styleSheet:可以修改文件的颜色和大小,颜色前面要加上color,不同应用之间要用;隔开
输入姓名与学号之后,点击ok按钮,则显示出来,并且保存到文件里
- 在firstui.h中:
private slots:
void on_pushok_clicked();
- 在firstui.cpp中
void firstui::on_pushok_clicked()
{
QString name=ui->linename->text();
QString id=ui->lineid->text();
qDebug()<<name<<" "<<id<<endl;
QFile file("/home/jxb/1612/12/12.20/student.txt");
if(!file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append))
{
return;
}
QTextStream out(&file);
out<<name<<" "<<id<<endl;
}
- 则已在文件里保存了信息,如果student.txt前没有加路劲,则默认在别的路径下,不好找,最好加路径
- 性别可分为男或者女,这样就要弄可选择的按钮,即单选按钮Radio Button
- 在firstui.cpp中
void firstui::on_pushok_clicked()
{
QString name=ui->linename->text();
QString id=ui->lineid->text();
QString sex=ui->sex->checkedButton()->text();//这里的sex是组名
qDebug()<<name<<" "<<id<<endl;
QFile file("/home/jxb/1612/12/12.20/student.txt");
if(!file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append))
{
return;
}
QTextStream out(&file);
out<<name<<" "<<id<<" "<<sex<<endl;
}
- 单选按钮man和female,我们可以把它们放在一个组里,如何选择组,选中两个单项按钮,然后右击,选择第二项,可以把组的名字改为sex.
- 结果为如下:
- 年龄可以有很多个年龄,则就要用到复选框,combo Box
- 在firstui.cpp中
void firstui::on_pushok_clicked()
{
QString name=ui->linename->text();
QString id=ui->lineid->text();
QString sex=ui->sex->checkedButton()->text();
QString age=ui->comboBox->currentText();
qDebug()<<name<<" "<<id<<endl;
QFile file("/home/jxb/1612/12/12.20/student.txt");
if(!file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append))
{
return;
}
QTextStream out(&file);
out<<name<<" "<<id<<" "<<sex<<" "<<age<<endl;
}
- 则运行结果为,可以选择适当的年龄:双击复选框,则进入编辑,调价多个项
科目如上,与age相同
- 在firstui.cpp中
void firstui::on_pushok_clicked()
{
QString name=ui->linename->text();
QString id=ui->lineid->text();
QString sex=ui->sex->checkedButton()->text();
QString age=ui->comboBox->currentText();
QString college=ui->comboBox_2->currentText();
qDebug()<<name<<" "<<id<<endl;
QFile file("/home/jxb/1612/12/12.20/student.txt");
if(!file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append))
{
return;
}
QTextStream out(&file);
out<<name<<" "<<id<<" "<<sex<<" "<<age<<" "<<college<<endl;
}
- 结果为如下:
兴趣爱好,会有许多的兴趣爱好,符合要求的都要勾上,则就要用到check Box
- 如果要多选的话,则就要把右下角interset组的exclusive的勾去掉,即去掉互斥性
- 则结果为:这里面用到了链表QList,则要包含头文件
#include <QDebug>//要显示line里面的内容要加的
#include <QTextStream>
#include <QFile>//存到文件需要加的
#include <QList>
#include <QAbstractButton>
- 在firstui.cpp中:
void firstui::on_pushok_clicked()
{
QString name=ui->linename->text();
QString id=ui->lineid->text();
QString sex=ui->sex->checkedButton()->text();
QString age=ui->comboBox->currentText();
QString college=ui->comboBox_2->currentText();
QList<QAbstractButton*>ins=ui->interset->buttons();
qDebug()<<name<<" "<<id<<endl;
QFile file("/home/jxb/1612/12/12.20/student.txt");
if(!file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append))
{
return;
}
QTextStream out(&file);
out<<name<<" "<<id<<" "<<sex<<" "<<age<<" "<<college;
for(int i=0;i<ins.size();i++)
{
if(ins[i]->isChecked())
{
out<<" "<<ins[i]->text();
}
}
out<<endl;
}
在上一次输入完成之后,清空里面的内容
- 在firstui.cpp中:
void firstui::on_pushok_clicked()
{
QString name=ui->linename->text();
QString id=ui->lineid->text();
QString sex=ui->sex->checkedButton()->text();
QString age=ui->comboBox->currentText();
QString college=ui->comboBox_2->currentText();
QList<QAbstractButton*>ins=ui->interset->buttons();
qDebug()<<name<<" "<<id<<endl;
QFile file("/home/jxb/1612/12/12.20/student.txt");
if(!file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append))
{
return;
}
QTextStream out(&file);
out<<name<<" "<<id<<" "<<sex<<" "<<age<<" "<<college;
for(int i=0;i<ins.size();i++)
{
if(ins[i]->isChecked())
{
out<<" "<<ins[i]->text();
ins[i]->setChecked(false);
}
}
out<<endl;
file.close();
ui->linename->clear();
ui->lineid->clear();
ui->comboBox->setCurrentIndex(0);
ui->comboBox_2->setCurrentIndex(0);
ui->sex->setExclusive(false);//
ui->sex->checkedButton()->setChecked(false);//
ui->sex->setExclusive(true);//这三句是清空sex的选项
}
void firstui::on_pushno_clicked()
{
close();
}
- 程序运行之前
- 在程序运行之后
如果姓名想要兼容中文,则在main.cpp中
#include "firstui.h"
#include <QApplication>
#include <QTextCodec>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec* codec=QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForLocale(codec);
firstui w;
w.show();
return a.exec();
}
- 能成功编译过,并且能存入道文件中
学生管理系统第二部分
- 第一部分已经可以得到如下界面并且可以吧信息保存到文件中
开始制作主界面
- Add New
- Add New之后,我们继续执行
- 最后得到一个新的类
- 各函数程序如下
stuAndTea_main.cpp
#include "stuandtea_main.h"
#include "ui_stuandtea_main.h"
#include "firstui.h"
stuAndTea_main::stuAndTea_main(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::stuAndTea_main)
{
ui->setupUi(this);
}
stuAndTea_main::~stuAndTea_main()
{
delete ui;
}
void stuAndTea_main::on_actionAdd_triggered()
{
/*firstui *q=new firstui;q->show();*/ //将其设置为非模态,与main函数平级
firstui p;
p.exec();
}
main.cpp
#include "firstui.h"
#include <QApplication>
#include "stuandtea_main.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
stuAndTea_main w;
//firstui w;
w.show();
return a.exec();
}
firstui.cpp
#include "firstui.h"
#include "ui_firstui.h"
#include <QDebug>
#include <QFile>
#include <QTextStream>
#include <QList>
#include <QAbstractButton>
firstui::firstui(QWidget *parent) :
QDialog(parent),
ui(new Ui::firstui)
{
ui->setupUi(this);
}
firstui::~firstui()
{
delete ui;
}
void firstui::on_pushButton_clicked()
{
QString name=ui->lineName->text();
QString id=ui->lineId->text();
QString sex=ui->sexGroup->checkedButton()->text();
QString age=ui->comboBox->currentText();
QString col=ui->comboBox_2->currentText();
QList<QAbstractButton*>ins=ui->interestGroup->buttons();
qDebug()<<name<<" "<<id<<endl;
QFile file("/home/sunsuhui/1612/12/12.20/stuAndTea.txt");
if(!file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append))
{
return;
}
QTextStream out(&file);
out<<name<<" "<<id<<" "<<sex<<" "<<age<<" "<<col;
for(int i=0;i<ins.size();i++)
{
if(ins[i]->isChecked())
{
out<<" "<<ins[i]->text();
ins[i]->setChecked(false);
}
}
out<<endl;
file.close();
//after manage empty all
ui->lineName->clear();
ui->lineId->clear();
ui->comboBox->setCurrentIndex(0);
ui->comboBox_2->setCurrentIndex(0);
//clear radio button
ui->sexGroup->setExclusive(false);
ui->sexGroup->checkedButton()->setChecked(false);
ui->sexGroup->setExclusive(true);
}
void firstui::on_pushButton_2_clicked()
{
close();
}
- 非模态状态下show推出窗体马上返回,将其更改之后可得到关闭主窗体也不会关闭子窗体。模态状态下p.exec一直存在于主界面上,得到子界面。
-
add之后直接得到add界面
-
增加副窗口
- 在一系列的执行之后出现错误,解决方案:进入stuAndTea.pro文件将上次删除文件的.h文件等。
- 将上部分制作的sel的槽指向该副窗口
void stuAndTea_main::on_actionSel_triggered()
{
my_sel p;
p.exec();
}
- 加入专管显示的table view
- 在sel.h中添加头文件
#include <QStandardItemModel> private: Ui::my_sel *ui; QStandardItemModel *stu_model;
- 在sel.cpp中添加
my_sel::my_sel(QWidget *parent) : QDialog(parent), ui(new Ui::my_sel) { ui->setupUi(this); //创建一个model(数据模型) stu_model=new QStandardItemModel; //设置modle显示模式 stu_model->setHorizontalHeaderItem(0,new QStandardItem(QObject::tr("name"))); stu_model->setHorizontalHeaderItem(1,new QStandardItem(QObject::tr("num"))); stu_model->setHorizontalHeaderItem(2,new QStandardItem(QObject::tr("sex"))); stu_model->setHorizontalHeaderItem(3,new QStandardItem(QObject::tr("age"))); stu_model->setHorizontalHeaderItem(4,new QStandardItem(QObject::tr("college"))); stu_model->setHorizontalHeaderItem(5,new QStandardItem(QObject::tr("interest"))); //利用setmodel()方法将数据模型与tableview绑定 ui->tableView->setModel(stu_model); //设置显示宽度 ui->tableView->setColumnWidth(0,100); ui->tableView->setColumnWidth(1,50); ui->tableView->setColumnWidth(2,50); ui->tableView->setColumnWidth(3,50); ui->tableView->setColumnWidth(4,100); ui->tableView->setColumnWidth(5,200); }
-
结果如下
- 下一步要将文件中的内容读取到table view里。
- 修改sel.h文件
#include <QList> #include <QString> private: Ui::my_sel *ui; QStandardItemModel *stu_model; QList<QString> stu_line;
- 修改sel.cpp文件
//打开目标文件夹 QFile file("/home/sunsuhui/1612/12/12.20/stuAndTea.txt"); if(!file.open(QIODevice::ReadOnly|QIODevice::Text)) { return; } //遍历访问其中数据 while(!file.atEnd()) { stu_lines.append(file.readLine()); } //到了第六列以后强读 int t=6; QString temp(subs[5]); while(t<subs.size()) { temp.append(" "); temp.append(subs[t++]); } stu_model->setItem(i,5,new QStandardItem(temp));
-
效果如下
增加查询界面
if(index==0
{
if(cn!=subs[0])
{
continue;
}
}
if(index==1)
{
if(cn!=subs[1])
{
continue;
}
}
if(index==2)
{
if(cn!=subs[2])
{
continue;
}
}
制作删除界面
- 大部分为复制
.cpp中
#include "my_del.h"
#include "ui_my_del.h"
#include <QFile>
my_del::my_del(QWidget *parent) :
QDialog(parent),
ui(new Ui::my_del)
{
ui->setupUi(this);
QFile file("/home/sunsuhui/1612/12/12.20/stuAndTea.txt");
if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
{
return;
}
//遍历访问其中数据
while(!file.atEnd())
{
stu_lines.append(file.readLine());
}
displayind(0);
}
my_del::~my_del()
{
delete ui;
}
void my_del::displayind(int ind)
{
QString line=stu_lines[ind];
QStringList subs=line.split(' ');
ui->lineName->setText(subs[0]);
ui->lineId->setText(subs[1]);
}
void my_del::displayind(int ind)
{
//show name&id
QString line=stu_lines[ind];
QStringList subs=line.split(' ');
ui->lineName->setText(subs[0]);
ui->lineId->setText(subs[1]);
//把人物的性别提取放入button(第三列)
QList<QAbstractButton*> se=ui->sexGroup->buttons();
for(int i=0;i<se.size();i++)
{
if(se[i]->text()==subs[2])
{
se[i]->setChecked(true);
}
}
//得到age和college
int ageind=ui->comboBox->findText(subs[3]);
ui->comboBox->setCurrentIndex(ageind);
int collegeind=ui->comboBox_2->findText(subs[4]);
ui->comboBox_2->setCurrentIndex(collegeind);
//得到interest
QList<QAbstractButton*> ins=ui->interestGroup->buttons();
for(int j=0;j<ins.size();j++)
{
ins[j]->setChecked(false);
}
for(int i=5;i<subs.size();i++)
{
QString temp=subs[i].trimmed();//将\n去掉
for(int j=0;j<ins.size();j++)
{
if(ins[j]->text()==temp)
{
ins[j]->setChecked(true);
break;
}
}
}
}
void my_del::on_pushclose_clicked()
{
QFile file("/home/sunsuhui/1612/12/12.20/stuAndTea.txt");
if(!file.open(QIODevice::WriteOnly|QIODevice::Text))
{
return;
}
QTextStream out(&file);
for(int i=0;i<stu_lines.size();i++)
{
out<<stu_lines[1].trimmed()<<endl;
}
file.close();
close();
}
.h中
void displayind(int ind);
-
可得到最终界面,删除并保存到文件中
制作更改界面
-
前面的操作相同,将部分代码直接复制,upd—clicked的代码不同。
QString temp; QString name=ui->lineName->text(); QString id=ui->lineId->text(); QString sex=ui->sexGroup->checkedButton()->text(); QString age=ui->comboBox->currentText(); QString col=ui->comboBox_2->currentText(); temp.append(name);temp.append(" "); temp.append(id);temp.append(" "); temp.append(sex);temp.append(" "); temp.append(age);temp.append(" "); temp.append(col); QList<QAbstractButton*> ins=ui->interestGroup->buttons(); for(int i=0;i<ins.size();i++) { if(ins[i]->isChecked()) { temp.append(" "); temp.append(ins[i]->text()); ins[i]->setChecked(false); } } stu_lines[m_id]=temp;
在关闭的时候我们没法实现点击X按钮实现保存,只能用close保存。
.cpp中
void my_del::on_pushclose_clicked()
{
close();
}
void my_del::closeEvent(QCloseEvent *event)
{
QFile file("/home/sunsuhui/1612/12/12.20/stuAndTea.txt");
if(!file.open(QIODevice::WriteOnly|QIODevice::Text))
{
return;
}
QTextStream out(&file);
for(int i=0;i<stu_lines.size();i++)
{
out<<stu_lines[i].trimmed()<<endl;
}
file.close();
}
.h中
protected:
void closeEvent(QCloseEvent *event);
关闭时出现提示窗体
头文件
#include <QTextStream>
#include <QMessageBox>
#include <QDebug>
#include <QCloseEvent>
void my_del::on_pushclose_clicked()
{
QMessageBox::about(NULL,"nihao","hallo");//NULL告诉他窗体之间关联
//close();
}
if(QMessageBox::Cancel==QMessageBox::warning\
(NULL,"close me","sure",QMessageBox::Cancel|QMessageBox::Ok))
{
event->ignore();
return;
}