在项目上面追加一个新的文件
- 点击已有的项目上右击选择Add New,如下
- 添加完成之后,在student.ui里,添加一些菜单
- 然后先将add设置到槽,然后,在student.h中:
private slots:
void on_actionAdd_triggered();
void on_actionSel_triggered();
- 在student.cpp中
void student::on_actionAdd_triggered()
{
firstui *q=new firstui;
q->show();
//firstui q;
//q.exec();
}
- 在main.cpp中
QApplication a(argc, argv);
QTextCodec* codec=QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForLocale(codec);
//firstui w;
student w;
w.show();
- 运行结果为,点击左上角的stu下拉菜单中add,则会出现那张表:
做选择菜单
即是菜单里的sel,这是需要重新添加文件,改名为zyzselect
- QStandardItemModel的优点:可以实现对不同表的定制化显示,在Qtableview中可以直接显示表头。 QStandardItemModel的缺点:操作繁琐,代码量大。
- 在zyzselect.h中:
#ifndef FIRSTUI_H
#define FIRSTUI_H
#include <QDialog>
namespace Ui {
class firstui;
}
class firstui : public QDialog
{
Q_OBJECT
public:
explicit firstui(QWidget *parent = 0);
~firstui();
private slots:
void on_pushok_clicked();
void on_pushno_clicked();
private:
Ui::firstui *ui;
};
#endif // FIRSTUI_H
- 在zyzselect.cpp中
#include "zyzselect.h"
#include "ui_zyzselect.h"
zyzselect::zyzselect(QWidget *parent) :
QDialog(parent),
ui(new Ui::zyzselect)
{
ui->setupUi(this);
stu_model=new QStandardItemModel;
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("interset")));
//设置表格的长和宽
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);
}
zyzselect::~zyzselect()
{
delete ui;
}
- 在zyzselect.ui中,此时用的是Table Vew
- 此时的结果是:
要读出文件的内容,并且以表格的形式显示
- 在zyzselect.h中,要加头文件
#include <QList>
#include <QString>
public:
explicit zyzselect(QWidget *parent = 0);
~zyzselect();
void doquery();
private:
Ui::zyzselect *ui;
QStandardItemModel* stu_model;
QList<QString>stu_lines;
- 在zyzselect.cpp中
ui(new Ui::zyzselect)
{
ui->setupUi(this);
QFile file("/home/jxb/1612/12/12.21/student.txt");
if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
{
return;
}
while(!file.atEnd())
{
stu_lines.append(file.readLine());
}
stu_model=new QStandardItemModel;
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("interset")));
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);
doquery();
}
void zyzselect::doquery()
{
for(int i=0;i<stu_lines.size();i++)
{
QString line=stu_lines[i];
QStringList subs=line.split(' ');
for(int j=0;j<5;j++)
{
stu_model->setItem(i,j,new QStandardItem(subs[j]));
}
}
}
- 则运行结果为,但是只显示前5列:
解决以上只显示5列的现象,将兴趣也输出
- 在zyzselect.h中:
public:
explicit zyzselect(QWidget *parent = 0);
~zyzselect();
void doquery();
private:
Ui::zyzselect *ui;
QStandardItemModel* stu_model;
QList<QString>stu_lines;
- 在zyzselect.cpp中:
void zyzselect::doquery()
{
for(int i=0;i<stu_lines.size();i++)
{
QString line=stu_lines[i];
QStringList subs=line.split(' ');
for(int j=0;j<5;j++)
{
stu_model->setItem(i,j,new QStandardItem(subs[j]));
}
int t=6;//链表前6个固定不变
QString temp(subs[5]);
while(t<subs.size())//判断是否出界,出界则代表到了链表结尾
{
temp.append(" ");//用一个空格将字符隔开
temp.append(subs[t++]);
}
stu_model->setItem(i,5,new QStandardItem(temp));
}
}
- 运行结果为:
- 在表格上面添加一些按钮,即是增加一些条件,查找符合条件的同学
- 则在zyzselect.h中:
public:
explicit zyzselect(QWidget *parent = 0);
~zyzselect();
void doquery(int index,QString cn);
private slots:
void on_pushsel_clicked();
private:
Ui::zyzselect *ui;
QStandardItemModel* stu_model;
QList<QString>stu_lines;
- 在zyzselect.cpp中:
ui(new Ui::zyzselect)
{
ui->setupUi(this);
QFile file("/home/jxb/1612/12/12.21/student.txt");
if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
{
return;
}
while(!file.atEnd())
{
stu_lines.append(file.readLine());
}
stu_model=new QStandardItemModel;
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("interset")));
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);
//doquery();
}
void zyzselect::doquery(int index,QString cn)
{
int k=0;
for(int i=0;i<stu_lines.size();i++)
{
QString line=stu_lines[i];
QStringList subs=line.split(' ');/显示一个学生信息
if(index==0)//ru guo bijiao mingzi
{
if(cn!=subs[0])//如果关键字不等于姓名,则继续
{
continue;
}
}
if(index==1)//ru guo bijiao id
{
if(cn!=subs[1])//如果关键字不等于id,则继续
{
continue;
}
}
if(index==2)
{
if(cn!=subs[2])//如果关键字不等于性别,则继续
{
continue;
}
}
if(index==3)
{
if(cn!=subs[3])/如果关键字不等于年龄,则继续
{
continue;
}
}
if(index==4)
{
if(cn!=subs[4])//如果关键字不等于科目
{
continue;
}
}
for(int j=0;j<5;j++)
{
stu_model->setItem(k,j,new QStandardItem(subs[j]));
}
int t=6;
QString temp(subs[5]);
while(t<subs.size())
{
temp.append(" ");
temp.append(subs[t++]);
}
stu_model->setItem(k++,5,new QStandardItem(temp));
}
}
zyzselect::~zyzselect()
{
delete ui;
}
void zyzselect::on_pushsel_clicked()
{
int ind=ui->comboBox->currentIndex();
QString cnt=ui->lineEdit->text();//从显示层读到逻辑层
doquery(ind,cnt);
}
则结果为:
删除
- 可以在别的图形界面上复制他的按钮,然后粘贴到另外一个图形界面,需要注意的是复制粘贴过来后,有的隐藏的添加组合和组的互斥性
- 首先得到第一个学生的姓名与id
- 在zyzdel.h中:要添加头文件
#include <QDialog>
#include <QList>
#include <QString>
- 在zyzdel.cpp中:添加头文件:
#include <QFile>
#include <QList>
ui(new Ui::zyzdel)
{
ui->setupUi(this);
QFile file("/home/jxb/1612/12/12.21/student.txt");
if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
{
return;
}
while(!file.atEnd())
{
stu_lines.append(file.readLine());
}
displayind(0);
}
void zyzdel::displayind(int ind)
{
QString line=stu_lines[ind];
QStringList subs=line.split(' ');
ui->linename->setText(subs[0]);//dedao diyige xuesheng de xingming
ui->lineid->setText(subs[1]);//dedao diyige xuesheng de id
}
- 则运行结果为:
通过读取文件,获得学生姓名,学号与性别
- 在zyzdel.cpp中
zyzdel::zyzdel(QWidget *parent) :
QDialog(parent),
ui(new Ui::zyzdel)
{
ui->setupUi(this);
QFile file("/home/jxb/1612/12/12.21/student.txt");
if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
{
return;
}
while(!file.atEnd())
{
stu_lines.append(file.readLine());
}
displayind(0);
}
void zyzdel::displayind(int ind)
{
QString line=stu_lines[ind];
QStringList subs=line.split(' ');
ui->linename->setText(subs[0]);//得到第一个学生的信息
ui->lineid->setText(subs[1]);//得到第一个学生的学号
QList<QAbstractButton*>se=ui->sex->buttons();//得到学生的性别,如果文件中为man,则单项按钮man自动被点亮,否则,female自动被点亮
for(int i=0;i<se.size();i++)
{
if(se[i]->text()==subs[2])
{
se[i]->setChecked(true);
}
}
}
- 则结果为:
通过读取文件,获得学生的年龄与课程
- 所以我们得先判断他们在下拉里面的第几个
- 在zyzdel.cpp中:
ui(new Ui::zyzdel)
{
ui->setupUi(this);
QFile file("/home/jxb/1612/12/12.21/student.txt");
if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
{
return;
}
while(!file.atEnd())
{
stu_lines.append(file.readLine());
}
displayind(0);
}
void zyzdel::displayind(int ind)
{
QString line=stu_lines[ind];
QStringList subs=line.split(' ');
ui->linename->setText(subs[0]);//dedao diyige xuesheng de xingming
ui->lineid->setText(subs[1]);//dedao diyige xuesheng de id
QList<QAbstractButton*>se=ui->sex->buttons();
for(int i=0;i<se.size();i++)
{
if(se[i]->text()==subs[2])
{
se[i]->setChecked(true);
}
}
int ageind=ui->comboBox->findText(subs[3]);//huo de nianling shi dijige xiala xuanxiang
ui->comboBox->setCurrentIndex(ageind);
int collegeind=ui->comboBox_2->findText(subs[4]);
ui->comboBox_2->setCurrentIndex(collegeind);
}
- 运行结果为:
补全interset
- 如果你有多项兴趣,而只显示了一个兴趣爱好,首先要考虑是不是互斥没有把勾去掉,如果去掉了,则可以是最后一个兴趣爱好后面有个\n,则我们要把它去掉,就可以全部显示出来,去掉使用QString temp=subs[i].trimmed();
- 在zyzdel.cpp中
ui(new Ui::zyzdel)
{
ui->setupUi(this);
QFile file("/home/jxb/1612/12/12.21/student.txt");
if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
{
return;
}
while(!file.atEnd())
{
stu_lines.append(file.readLine());
}
displayind(0);
}
void zyzdel::displayind(int ind)
{
QString line=stu_lines[ind];
QStringList subs=line.split(' ');
ui->linename->setText(subs[0]);//dedao diyige xuesheng de xingming
ui->lineid->setText(subs[1]);//dedao diyige xuesheng de id
QList<QAbstractButton*>se=ui->sex->buttons();
for(int i=0;i<se.size();i++)
{
if(se[i]->text()==subs[2])
{
se[i]->setChecked(true);
}
}
int ageind=ui->comboBox->findText(subs[3]);//huo de nianling shi dijige xiala xuanxiang
ui->comboBox->setCurrentIndex(ageind);
int collegeind=ui->comboBox_2->findText(subs[4]);
ui->comboBox_2->setCurrentIndex(collegeind);
QList<QAbstractButton*>ins=ui->interset->buttons();
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;
}
}
}
}
- 结果为:
以上只显示一个学生,要点击next按钮,则要循环显示学生信息,将next按钮添加到槽
- 在zyzdel.h中:
private slots:
void on_pushnext_clicked();
- 在zyzdel.cpp中
void zyzdel::on_pushnext_clicked()
{
m_id=++m_id%stu_lines.size();
displayind(m_id);
}
- 运行结果为:
- 遇到一个问题:兴趣在好,在上一个同学的基础上既然是叠加了
解决以上问题
ui(new Ui::zyzdel)
{
ui->setupUi(this);
QFile file("/home/jxb/1612/12/12.21/student.txt");
if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
{
return;
}
while(!file.atEnd())
{
stu_lines.append(file.readLine());
}
displayind(0);
}
void zyzdel::displayind(int ind)
{
QString line=stu_lines[ind];
QStringList subs=line.split(' ');
ui->linename->setText(subs[0]);//dedao diyige xuesheng de xingming
ui->lineid->setText(subs[1]);//dedao diyige xuesheng de id
QList<QAbstractButton*>se=ui->sex->buttons();
for(int i=0;i<se.size();i++)
{
if(se[i]->text()==subs[2])
{
se[i]->setChecked(true);
}
}
int ageind=ui->comboBox->findText(subs[3]);//huo de nianling shi dijige xiala xuanxiang
ui->comboBox->setCurrentIndex(ageind);
int collegeind=ui->comboBox_2->findText(subs[4]);
ui->comboBox_2->setCurrentIndex(collegeind);
QList<QAbstractButton*>ins=ui->interset->buttons();
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;
}
}
}
}
QList<QAbstractButton*>ins=ui->interset->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();//qudiao \n
for(int j=0;j<ins.size();j++)
{
if(ins[j]->text()==temp)
{
ins[j]->setChecked(true);
break;
}
}
}
- 可以在之前清除一下
delete按钮
- 在zyzdel.h中:
private slots:
void on_pushnext_clicked();
void on_pushdelete_clicked();
- 在zyzdel.cpp中
void zyzdel::on_pushdelete_clicked()
{
if(stu_lines.size()<=1)
{
return;
}
if(m_id>=stu_lines.size())
{
m_id=0;
}
stu_lines.removeAt(m_id);
displayind(m_id);
}
- 运行结果为,按了delete之后,bbb被删除:
- 点击完delete之后,要点击no按钮才会被保存,如果直接退出的话,不会被保存,如图所见,姓名为bbb的同学已经被删除
删除界面的升级版
- 可以将下面的代码,对从文件里读取数据的操作,重新封装为一个函数
void my_del::readfile(QList<QString>& stu)
{
QFile file("/home/sunsuhui/1612/12/12.20/stuAndTea.txt");
if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
{
return;
}
//遍历访问其中数据
while(!file.atEnd())
{
stu.append(file.readLine());
}
}
- 则ui函数里的代码如下
ui(new Ui::my_del)
{
ui->setupUi(this);
my_del::readfile(stu_lines);
m_id=0;
displayind(0);
}
- 如上,删除时点击no按钮则退出系统并且会保存到文件里,将要删除的那个人从文件中除去,并且保存.我们增强在点击close按钮时则弹出提示框,如果点击ok则保存到文件中,则为确定删除,点击cancel则退出提示框,重新考虑一下.
- 在zyzdel.cpp中
void my_del::closeEvent(QCloseEvent *event)
{
if(QMessageBox::Cancel==QMessageBox::warning\
(NULL,"close me","sure",QMessageBox::Cancel|QMessageBox::Ok))
{
event->ignore();
return;
}
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();
}
- 如下.点击close按钮之后,则弹出提示框
如果点击concel,则返回到上一层界面,如下,并且文件还没有删除掉这个人的信息
- 如果点击ok按钮之后,则文件里删除了此人的信息,并且退出系统
则删除界面已完善
- 在zyzdel.h中
#ifndef MY_DEL_H
#define MY_DEL_H
#include <QDialog>
namespace Ui {
class my_del;
}
class my_del : public QDialog
{
Q_OBJECT
public:
explicit my_del(QWidget *parent = 0);
~my_del();
//show student(ind deside how much stu shows)
void displayind(int ind);
int m_id;
static void readfile(QList<QString>& stu);
private slots:
void on_pushclose_clicked();
void on_pushNext_clicked();
void on_pushDel_clicked();
private:
Ui::my_del *ui;
QList<QString> stu_lines;
protected:
void closeEvent(QCloseEvent *event);
};
#endif // MY_DEL_H
- 在zyzdel.cpp中
#include "my_del.h"
#include "ui_my_del.h"
#include <QFile>
#include <QTextStream>
#include <QMessageBox>
#include <QDebug>
#include <QCloseEvent>
my_del::my_del(QWidget *parent) :
QDialog(parent),
ui(new Ui::my_del)
{
ui->setupUi(this);
my_del::readfile(stu_lines);
m_id=0;
displayind(0);
}
my_del::~my_del()
{
delete ui;
}
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_pushNext_clicked()
{
m_id=++m_id%stu_lines.size();
displayind(m_id);
}
void my_del::on_pushDel_clicked()
{
if(stu_lines.size()<=1)
{
return;
}
stu_lines.removeAt(m_id);
if(m_id>=stu_lines.size())
{
m_id=0;
}
displayind(m_id);
}
void my_del::on_pushclose_clicked()
{
//QMessageBox::about(NULL,"nihao","hallo");//NULL告诉他窗体之间关联
close();
}
void my_del::closeEvent(QCloseEvent *event)
{
if(QMessageBox::Cancel==QMessageBox::warning\
(NULL,"close me","sure",QMessageBox::Cancel|QMessageBox::Ok))
{
event->ignore();
return;
}
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();
}
void my_del::readfile(QList<QString>& stu)
{
QFile file("/home/sunsuhui/1612/12/12.20/stuAndTea.txt");
if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
{
return;
}
//遍历访问其中数据
while(!file.atEnd())
{
stu.append(file.readLine());
}
}
更改学生数据
- 在图形界面中
- 其余代码都相同,只有upd-clicked的代码不同
- 在student.h中
private slots:
void on_actionAdd_triggered();
void on_actionSel_triggered();
void on_actionDel_triggered();
void on_actionUpd_triggered();
- 在student.cp中为:
void student_main::on_actionDel_triggered()
{
my_del p;
p.exec();
}
void student_main::on_actionUpd_triggered()
{
my_upd p;
p.exec();
}
- 在zyzupd.h中
public:
explicit my_upd(QWidget *parent = 0);
~my_upd();
void displayind(int ind);
private slots:
void on_pushNext_clicked();
void on_pushUpd_clicked();
void on_pushclose_clicked();
private:
Ui::my_upd *ui;
QList<QString> stu_lines;
int m_id;
protected:
void closeEvent(QCloseEvent *event);
- 在zyzupd.cpp中
void my_upd::on_pushUpd_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;
}