• QT 学生管理系统 练习


     我们要构建一个学生管理系统

    分为两个窗口

    1.主界面

    2.界面二是添加界面

     3.类图

    可以看出项目分为四个类  

    其中 主接面Widget类关联添加界面Dialog类和Control类

    Dialog类依赖学生类Student

    Control类聚合学生类Student

    首先我们完成学生类的实现 主要的功能就是设置和获得学生信息

    1. #ifndef STUDENT_H
    2. #define STUDENT_H
    3. #include
    4. class Student
    5. {
    6. private:
    7. QString strId;
    8. QString strName;
    9. QString strSex;
    10. QString strAge;
    11. QString strChinese;
    12. QString strEnglish;
    13. QString strMath;
    14. public:
    15. Student();
    16. void SetId(QString& id);
    17. void SetName(QString& name);
    18. void SetSex(QString& sex);
    19. void SetAge(QString& age);
    20. void SetChinese(QString& chinese);
    21. void SetEnglish(QString& english);
    22. void SetMath(QString& math);
    23. QString GetId();
    24. QString GetName();
    25. QString GetSex();
    26. QString GetAge();
    27. QString GetChinese();
    28. QString GetEnglish();
    29. QString GetMath();
    30. };
    31. #endif // STUDENT_H
    1. #include "student.h"
    2. Student::Student()
    3. {
    4. }
    5. void Student::SetId(QString& id)
    6. {
    7. strId=id;
    8. }
    9. void Student::SetName(QString& name)
    10. {
    11. strName=name;
    12. }
    13. void Student::SetSex(QString& sex)
    14. {
    15. strSex=sex;
    16. }
    17. void Student::SetAge(QString& age)
    18. {
    19. strAge=age;
    20. }
    21. void Student::SetChinese(QString& chinese)
    22. {
    23. strChinese=chinese;
    24. }
    25. void Student::SetEnglish(QString& english)
    26. {
    27. strEnglish=english;
    28. }
    29. void Student::SetMath(QString& math)
    30. {
    31. strMath=math;
    32. }
    33. QString Student::GetId()
    34. {
    35. return strId;
    36. }
    37. QString Student::GetName()
    38. {
    39. return strName;
    40. }
    41. QString Student::GetSex()
    42. {
    43. return strSex;
    44. }
    45. QString Student::GetAge()
    46. {
    47. return strAge;
    48. }
    49. QString Student::GetChinese()
    50. {
    51. return strChinese;
    52. }
    53. QString Student::GetEnglish()
    54. {
    55. return strEnglish;
    56. }
    57. QString Student::GetMath()
    58. {
    59. return strMath;
    60. }

    然后在对我们的添加界面Dialog进行实现

    在画完Dialog窗口后 我们需要对  提交按钮 和  取消按钮  添加槽函数

    public slots:
        void on_pushButtonOk_clicked();

    //获取当前输入框的信息  如果满足条件  创建Student节点向Control类中的存Student*的链表上添加

        void on_pushButtonCancel_clicked();

    //退出

    1. void Dialog::on_pushButtonOk_clicked()
    2. {
    3. //获取但行输入框
    4. QString Id=ui->lineEditId->text();
    5. QString Age=ui->lineEditAge->text();
    6. QString Sex=ui->lineEditSex->text();
    7. QString Name=ui->lineEditName->text();
    8. QString Chinese=ui->lineEditChinese->text();
    9. QString English=ui->lineEditEnglish->text();
    10. QString Math=ui->lineEditMath->text();
    11. //判断数据是否完整
    12. if(Id!=""&&Age!=""&&Sex!=""&&Name!=""&&Chinese!=""&&English!=""&&Math!="")
    13. {
    14. //创建学生对象
    15. Student *stu=new Student;
    16. stu->SetId(Id);
    17. stu->SetAge(Age);
    18. stu->SetSex(Sex);
    19. stu->SetName(Name);
    20. stu->SetChinese(Chinese);
    21. stu->SetEnglish(English);
    22. stu->SetMath(Math);
    23. //发送信号
    24. emit MyUpdate(stu);
    25. //退出
    26. this->close();
    27. }
    28. else
    29. {
    30. //消息对话框提示
    31. QMessageBox::warning(this,"提示","请将数据录入完整");
    32. }
    33. }
    34. void Dialog::on_pushButtonCancel_clicked()
    35. {
    36. this->close();
    37. }

    接下来  开始对控制类Control进行编写 这里我们用到了单例模式

    只允许有一个控制类:

    定义一个本类型的静态指针

    将构造函数设置为私有的  设置一个公有的静态函数用来创建Control对象

     static Control*Getcon();

    Control*Control::Getcon()
    {
        if(con==nullptr);
        {
            con=new Control;
        }
        return con;
    }

    类中有一个成员变量  是一个存Student类对象指针的链表

    类中有一些成员方法  是对Student类对象指针的链表的一些操作  

    这个链表我们用到了链表容器

    list & GetList();  返回链表
         void Addlst(Student*stu); 链表节点添加
         void Delete(QString id);  链表节点删除
         void ListToFile();  链表向文件里写入
         void FileToList(); 文件向链表里写出

    这里的文件操作我们用到了相对路径

    #define PATH "..\\Student.txt"

    含义是  当前编译文件的位置的上一级  在进入到Student.txt中

     

    1. class Control
    2. {
    3. private:
    4. static Control*con;
    5. private:
    6. Control();
    7. Control(Control&con);
    8. list lst;
    9. public:
    10. ~Control();
    11. static Control*Getcon();
    12. list & GetList();
    13. void Addlst(Student*stu);
    14. void Delete(QString id);
    15. void ListToFile();
    16. void FileToList();
    17. };
    1. #include "control.h"
    2. #include
    3. Control:: Control()
    4. {
    5. }
    6. Control::Control(Control&con)
    7. {
    8. }
    9. Control::~Control()
    10. {
    11. auto ite=lst.begin();
    12. while(ite!=lst.end())
    13. {
    14. delete*ite;
    15. ite++;
    16. }
    17. }
    18. Control*Control::con=nullptr;//静态指针在类外定义
    19. Control*Control::Getcon()
    20. {
    21. if(con==nullptr);
    22. {
    23. con=new Control;
    24. }
    25. return con;
    26. }
    27. list & Control::GetList()
    28. {
    29. return lst;
    30. }
    31. void Control:: Addlst(Student*stu)
    32. {
    33. lst.push_back(stu);
    34. }
    35. void Control:: Delete(QString id)
    36. {
    37. list::iterator ite=lst.begin();
    38. while(ite!=lst.end())
    39. {
    40. if((*ite)->GetId()==id)
    41. {
    42. delete *ite;
    43. lst.erase(ite);
    44. break;
    45. }
    46. ite++;
    47. }
    48. }
    49. void Control::ListToFile()
    50. {
    51. ofstream os;
    52. os.open(PATH);
    53. auto ite=lst.begin();
    54. while(ite!=lst.end())
    55. {
    56. string id=(*ite)->GetId().toStdString();
    57. string name=(*ite)->GetName().toStdString();
    58. string sex=(*ite)->GetSex().toStdString();
    59. string age=(*ite)->GetAge().toStdString();
    60. string chinese=(*ite)->GetChinese().toStdString();
    61. string english=(*ite)->GetEnglish().toStdString();
    62. string math=(*ite)->GetMath().toStdString();
    63. os<" "<" "<" "<" "<" "<" "<
    64. ite++;
    65. }
    66. os.close();
    67. }
    68. void Control::FileToList()
    69. {
    70. ifstream is;
    71. is.open(PATH);
    72. string id,name,sex,age,chinese,english,math;
    73. while(is >> id>> name>> sex>> age >> chinese >> english >> math)
    74. {
    75. Student*stemp=new Student;
    76. QString strid = QString::fromStdString(id);
    77. QString strname = QString::fromStdString(name);
    78. QString strsex = QString::fromStdString(sex);
    79. QString strage = QString::fromStdString(age);
    80. QString strchinese = QString::fromStdString(chinese);
    81. QString strenglish = QString::fromStdString(english);
    82. QString strmath = QString::fromStdString(math);
    83. stemp->SetId(strid);
    84. stemp->SetName(strname);
    85. stemp->SetSex(strsex);
    86. stemp->SetAge(strage);
    87. stemp->SetChinese(strchinese);
    88. stemp->SetEnglish(strenglish);
    89. stemp->SetMath(strmath);
    90. Addlst(stemp);
    91. }
    92. is.close();
    93. }

    最后 开始主界面的实现

    主界面分为两大部分 和四大功能

    左表格  右  列表

    功能:添加 删除 查询 保存

     

    public:
        void ShowItem(Student*stu);将Control类对象  cont的链表信息显示在左侧表格上
        void showlistwidget(int row);右边显示第row行相关的信息

    public slots:
        void on_pushButtonAdd_clicked();添加功能的槽函数


        void on_MyUptate(Student*stu);

    Dialog中 MyUpdate(Student*stu)的槽函数  用来更新cont的链表
        void ShowList();
        void  closeEvent(QCloseEvent*event);

        void on_pushButtonSave_clicked();

    保存按钮的槽函数

        void on_tableWidget_cellClicked(int row, int column);

    表格被点击的槽函数

        void on_pushButtonSerch_clicked();

    查询按钮的槽函数

        void on_pushButtonDelete_clicked();

    删除按钮的槽函数

        void on_tableWidget_cellChanged(int row, int column);

    表格被修改的槽函数

    private:
        Ui::Widget *ui;
        Dialog*d;
        Control*cont;

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include "dialog.h"
    4. #include"control.h"
    5. #include
    6. #include
    7. #include
    8. #include
    9. QT_BEGIN_NAMESPACE
    10. namespace Ui { class Widget; }
    11. QT_END_NAMESPACE
    12. class Widget : public QWidget
    13. {
    14. Q_OBJECT
    15. public:
    16. Widget(QWidget *parent = nullptr);
    17. ~Widget();
    18. public:
    19. void ShowItem(Student*stu);
    20. void showlistwidget(int row);
    21. public slots:
    22. void on_pushButtonAdd_clicked();
    23. void on_MyUptate(Student*stu);
    24. void ShowList();
    25. void closeEvent(QCloseEvent*event);
    26. void on_pushButtonSave_clicked();
    27. void on_tableWidget_cellClicked(int row, int column);
    28. void on_pushButtonSerch_clicked();
    29. void on_pushButtonDelete_clicked();
    30. void on_tableWidget_cellChanged(int row, int column);
    31. private:
    32. Ui::Widget *ui;
    33. Dialog*d;
    34. Control*cont;
    35. };
    36. #endif // WIDGET_H

    首先我们说添加

    步骤大概是  点击添加按钮  弹出添加界面Dialog 的类对象  在添加界面操作 最后点保存或退出

    然后主界面和链表相应修改

    在添加界面操作完成后 点击ok按钮  

    如果数据完整  添加界面会发送一个信号

     emit MyUpdate(stu);

    void on_MyUptate(Student*stu);接受这个信号

    来对主界面和链表操作

    1. #include "dialog.h"
    2. #include "ui_dialog.h"
    3. using namespace std;
    4. Dialog::Dialog(QWidget *parent) :
    5. QDialog(parent),
    6. ui(new Ui::Dialog)
    7. {
    8. ui->setupUi(this);
    9. }
    10. Dialog::~Dialog()
    11. {
    12. delete ui;
    13. }
    14. void Dialog::on_pushButtonOk_clicked()
    15. {
    16. //获取但行输入框
    17. QString Id=ui->lineEditId->text();
    18. QString Age=ui->lineEditAge->text();
    19. QString Sex=ui->lineEditSex->text();
    20. QString Name=ui->lineEditName->text();
    21. QString Chinese=ui->lineEditChinese->text();
    22. QString English=ui->lineEditEnglish->text();
    23. QString Math=ui->lineEditMath->text();
    24. //判断数据是否完整
    25. if(Id!=""&&Age!=""&&Sex!=""&&Name!=""&&Chinese!=""&&English!=""&&Math!="")
    26. {
    27. //创建学生对象
    28. Student *stu=new Student;
    29. stu->SetId(Id);
    30. stu->SetAge(Age);
    31. stu->SetSex(Sex);
    32. stu->SetName(Name);
    33. stu->SetChinese(Chinese);
    34. stu->SetEnglish(English);
    35. stu->SetMath(Math);
    36. //发送信号
    37. emit MyUpdate(stu);
    38. //退出
    39. this->close();
    40. }
    41. else
    42. {
    43. //消息对话框提示
    44. QMessageBox::warning(this,"提示","请将数据录入完整");
    45. }
    46. }
    47. void Dialog::on_pushButtonCancel_clicked()
    48. {
    49. this->close();
    50. }

    //

    显示在右边的详细信息模块

    1. void Widget::showlistwidget(int row)
    2. {
    3. if(ui->listWidget->count()!=0)
    4. {
    5. ui->listWidget->item(0)->setText("学号:"+ui->tableWidget->item(row,0)->text());
    6. ui->listWidget->item(1)->setText("姓名:"+ui->tableWidget->item(row,1)->text());
    7. ui->listWidget->item(2)->setText("性别:"+ui->tableWidget->item(row,2)->text());
    8. ui->listWidget->item(3)->setText("年龄:"+ui->tableWidget->item(row,3)->text());
    9. ui->listWidget->item(4)->setText("数学:"+ui->tableWidget->item(row,4)->text());
    10. ui->listWidget->item(5)->setText("语文:"+ui->tableWidget->item(row,5)->text());
    11. ui->listWidget->item(6)->setText("英语:"+ui->tableWidget->item(row,6)->text());
    12. }
    13. else
    14. {
    15. ui->listWidget->addItem("学号:"+ui->tableWidget->item(row,0)->text());
    16. ui->listWidget->addItem("姓名:"+ui->tableWidget->item(row,1)->text());
    17. ui->listWidget->addItem("性别:"+ui->tableWidget->item(row,2)->text());
    18. ui->listWidget->addItem("年龄:"+ui->tableWidget->item(row,3)->text());
    19. ui->listWidget->addItem("数学:"+ui->tableWidget->item(row,4)->text());
    20. ui->listWidget->addItem("语文:"+ui->tableWidget->item(row,5)->text());
    21. ui->listWidget->addItem("英语:"+ui->tableWidget->item(row,6)->text());
    22. }
    23. }

    //

    在表格上显示一个节点的模块

    1. void Widget::ShowItem(Student*stu)
    2. {
    3. QObject::disconnect(ui->tableWidget,&QTableWidget::cellChanged,nullptr,nullptr);
    4. //获得总行数
    5. int row=ui->tableWidget->rowCount();
    6. //设置函数
    7. ui->tableWidget->setRowCount(row+1);
    8. //将信息显示到表格上
    9. ui->tableWidget->setItem( row,0,new QTableWidgetItem (stu->GetId()));
    10. ui->tableWidget->setItem( row,1,new QTableWidgetItem (stu->GetName()));
    11. ui->tableWidget->setItem( row,2,new QTableWidgetItem (stu->GetSex()));
    12. ui->tableWidget->setItem( row,3,new QTableWidgetItem (stu->GetAge()));
    13. ui->tableWidget->setItem( row,4,new QTableWidgetItem (stu->GetMath()));
    14. ui->tableWidget->setItem( row,5,new QTableWidgetItem (stu->GetChinese()));
    15. ui->tableWidget->setItem( row,6,new QTableWidgetItem (stu->GetEnglish()));
    16. QObject::connect(ui->tableWidget,&QTableWidget::cellChanged,this,&Widget:: on_tableWidget_cellChanged);
    17. }

    //

    保存模块

    1. void Widget::on_pushButtonSave_clicked()
    2. {
    3. cont->ListToFile();
    4. }

    //

    在表格上显示整个链表的模块

    //

    void Widget::ShowList()
    {
        auto ite=cont->GetList().begin();
        while(ite!=cont->GetList().end())

        {
            ShowItem(*ite);
            ite++;


        }
    }

    //

    退出时询问是否保存

    1. void Widget:: closeEvent(QCloseEvent*event)
    2. {
    3. QMessageBox::StandardButton but= QMessageBox::question(this,"提示","是否保存" );
    4. if(but==QMessageBox::StandardButton::Yes)
    5. {
    6. cont->ListToFile();
    7. }
    8. }

    //

    点击表格中任意一个格  在右侧显示当前行的详细信息

    1. void Widget::on_tableWidget_cellClicked(int row, int column)
    2. {
    3. showlistwidget( row);
    4. }

    //

    查询模块

    1. void Widget::on_pushButtonSerch_clicked()
    2. {
    3. //获取关键字
    4. QString str=ui->lineEdit->text();
    5. //获得表格总行数
    6. int Row=ui->tableWidget->rowCount();
    7. //循环比较关键字和表格上的第二列
    8. for(int i=0;i
    9. {
    10. QString name=ui->tableWidget->item(i,1)->text();
    11. if(name==str)
    12. {
    13. //显示到列表框
    14. showlistwidget(i);
    15. ui->lineEdit->clear();
    16. return ;
    17. }
    18. }
    19. QMessageBox::information(this, "错误 ","请输入正确姓名");
    20. ui->lineEdit->clear();
    21. }

    //

    删除模块

    1. void Widget::on_pushButtonDelete_clicked()
    2. {
    3. //这里实现了多选删除 (如:一次选择两行 一行选两个 2x2=4个)
    4. //不实现的话 一行选多个会报错 系统会重复删除该行
    5. QList qlst =ui->tableWidget->selectedItems();
    6. auto ite=qlst.begin();
    7. while(ite!=qlst.end())
    8. {
    9. int row=(*ite)->row();//获取单元格
    10. ite++;
    11. int Mark=-1;//删除判断标记
    12. if(ite!=qlst.end())//判断下一个是否为空
    13. {
    14. Mark=(*ite)->row();//把下一个赋给标记
    15. }
    16. if(row!=Mark)//不是一行的
    17. {
    18. //删除
    19. QString qstr=ui->tableWidget->item(row,0)->text();
    20. ui->tableWidget->removeRow(row);
    21. cont->Delete(qstr);
    22. }
    23. //是一行的
    24. //不操作 往下走
    25. ui->listWidget->clear();
    26. }
    27. }

    //

    修改模块

    1. void Widget::on_tableWidget_cellChanged(int row, int column)
    2. {
    3. QString qstr=ui->tableWidget->item(row,column)->text();
    4. QMessageBox::StandardButton but;
    5. if(column==0)
    6. {
    7. QMessageBox::warning(this,"警告","不允许修改学号");
    8. }
    9. else
    10. {
    11. but= QMessageBox::question(this,"提示","是否修改学号为["+ui->tableWidget->item(row,0)->text()+"]的信息");
    12. //获取当前链表的学号为这个的节点
    13. }
    14. auto ite=cont->GetList().begin();
    15. while(ite!=cont->GetList().end())
    16. {
    17. if((*ite)->GetId()==ui->tableWidget->item(row,0)->text())
    18. {
    19. break ;
    20. }
    21. ite++;
    22. }
    23. if(but==QMessageBox::Yes)
    24. {
    25. switch(column)
    26. {
    27. case 1:
    28. (*ite)->SetName(qstr);
    29. break;
    30. case 2:
    31. (*ite)->SetSex(qstr);
    32. break;
    33. case 3:
    34. (*ite)->SetAge(qstr);
    35. break;
    36. case 4:
    37. (*ite)->SetMath(qstr);
    38. break;
    39. case 5:
    40. (*ite)->SetChinese(qstr);
    41. break;
    42. case 6:
    43. (*ite)->SetEnglish(qstr);
    44. break;
    45. }
    46. showlistwidget(row);
    47. }
    48. else
    49. {
    50. QObject::disconnect(ui->tableWidget,&QTableWidget::cellChanged,nullptr,nullptr);
    51. switch(column)
    52. {
    53. case 0:
    54. {
    55. QString id=ui->listWidget->item(0)->text();
    56. QStringList qlst=id.split(":");
    57. ui->tableWidget->item(row,0)->setText(qlst[1]);
    58. }
    59. break;
    60. case 1:
    61. ui->tableWidget->item(row,1)->setText((*ite)->GetName());
    62. break;
    63. case 2:
    64. ui->tableWidget->item(row,2)->setText((*ite)->GetSex());
    65. break;
    66. case 3:
    67. ui->tableWidget->item(row,3)->setText((*ite)->GetAge());
    68. break;
    69. case 4:
    70. ui->tableWidget->item(row,4)->setText((*ite)->GetMath());
    71. break;
    72. case 5:
    73. ui->tableWidget->item(row,5)->setText((*ite)->GetChinese());
    74. break;
    75. case 6:
    76. ui->tableWidget->item(row,6)->setText((*ite)->GetEnglish());
    77. break;
    78. }
    79. QObject::connect(ui->tableWidget,&QTableWidget::cellChanged,this,&Widget:: on_tableWidget_cellChanged);
    80. }
    81. }

    这里需要注意的是  在一些情景下我们需要断开表格的修改信号和此槽函数的连接  我们只想在自己手动改变表格中的元素是在执行此槽函数  如:在系统最开始将文件中的数据添加到链表上 在由链表写到表格中的时候  就不需要这个函数发生所以在我们想断开修改信号和此槽函数的连接时

     用到QObject::disconnect(ui->tableWidget,&QTableWidget::cellChanged,nullptr,nullptr);

    //断开信号和槽
    //QObject::connect(AA,nullptr,nullptr,nullptr);
    //断开AA对象的一切信号和槽
    //QObject::connect(AA,&signalfun,nullptr,nullptr);
    //断开AA对象的signalfun信号的一切槽函数
    //QObject::connect(AA,nullptr,BB,nullptr);
    //断开AA对象与BB对象的一切信号和槽
    1. #include "widget.h"
    2. #include "ui_widget.h"
    3. #include "dialog.h"
    4. Widget::Widget(QWidget *parent)
    5. : QWidget(parent)
    6. , ui(new Ui::Widget)
    7. {
    8. ui->setupUi(this);
    9. setWindowTitle("学生管理系统");
    10. d=nullptr;
    11. cont=Control::Getcon();
    12. cont->FileToList();
    13. ShowList();
    14. ui->lineEdit->setPlaceholderText("请输入姓名");
    15. }
    16. Widget::~Widget()
    17. {
    18. delete ui;
    19. if(d)
    20. {
    21. delete d;
    22. }
    23. }
    24. void Widget::showlistwidget(int row)
    25. {
    26. if(ui->listWidget->count()!=0)
    27. {
    28. ui->listWidget->item(0)->setText("学号:"+ui->tableWidget->item(row,0)->text());
    29. ui->listWidget->item(1)->setText("姓名:"+ui->tableWidget->item(row,1)->text());
    30. ui->listWidget->item(2)->setText("性别:"+ui->tableWidget->item(row,2)->text());
    31. ui->listWidget->item(3)->setText("年龄:"+ui->tableWidget->item(row,3)->text());
    32. ui->listWidget->item(4)->setText("数学:"+ui->tableWidget->item(row,4)->text());
    33. ui->listWidget->item(5)->setText("语文:"+ui->tableWidget->item(row,5)->text());
    34. ui->listWidget->item(6)->setText("英语:"+ui->tableWidget->item(row,6)->text());
    35. }
    36. else
    37. {
    38. ui->listWidget->addItem("学号:"+ui->tableWidget->item(row,0)->text());
    39. ui->listWidget->addItem("姓名:"+ui->tableWidget->item(row,1)->text());
    40. ui->listWidget->addItem("性别:"+ui->tableWidget->item(row,2)->text());
    41. ui->listWidget->addItem("年龄:"+ui->tableWidget->item(row,3)->text());
    42. ui->listWidget->addItem("数学:"+ui->tableWidget->item(row,4)->text());
    43. ui->listWidget->addItem("语文:"+ui->tableWidget->item(row,5)->text());
    44. ui->listWidget->addItem("英语:"+ui->tableWidget->item(row,6)->text());
    45. }
    46. }
    47. void Widget::on_pushButtonAdd_clicked()
    48. {
    49. if(d)
    50. {
    51. delete d;
    52. }
    53. d=new Dialog(this);
    54. d->setWindowTitle("添加信息");
    55. QObject::connect(d,&Dialog::MyUpdate,this,&Widget::on_MyUptate);
    56. d->exec();
    57. }
    58. void Widget::on_MyUptate(Student*stu)
    59. {
    60. //将stu添加到list上去
    61. cont->Addlst(stu);
    62. //显示在表格中
    63. ShowItem(stu);
    64. }
    65. void Widget::ShowItem(Student*stu)
    66. {
    67. QObject::disconnect(ui->tableWidget,&QTableWidget::cellChanged,nullptr,nullptr);
    68. //获得总行数
    69. int row=ui->tableWidget->rowCount();
    70. //设置函数
    71. ui->tableWidget->setRowCount(row+1);
    72. //将信息显示到表格上
    73. ui->tableWidget->setItem( row,0,new QTableWidgetItem (stu->GetId()));
    74. ui->tableWidget->setItem( row,1,new QTableWidgetItem (stu->GetName()));
    75. ui->tableWidget->setItem( row,2,new QTableWidgetItem (stu->GetSex()));
    76. ui->tableWidget->setItem( row,3,new QTableWidgetItem (stu->GetAge()));
    77. ui->tableWidget->setItem( row,4,new QTableWidgetItem (stu->GetMath()));
    78. ui->tableWidget->setItem( row,5,new QTableWidgetItem (stu->GetChinese()));
    79. ui->tableWidget->setItem( row,6,new QTableWidgetItem (stu->GetEnglish()));
    80. QObject::connect(ui->tableWidget,&QTableWidget::cellChanged,this,&Widget:: on_tableWidget_cellChanged);
    81. }
    82. void Widget::on_pushButtonSave_clicked()
    83. {
    84. cont->ListToFile();
    85. }
    86. void Widget::ShowList()
    87. {
    88. auto ite=cont->GetList().begin();
    89. while(ite!=cont->GetList().end())
    90. {
    91. ShowItem(*ite);
    92. ite++;
    93. }
    94. }
    95. void Widget:: closeEvent(QCloseEvent*event)
    96. {
    97. QMessageBox::StandardButton but= QMessageBox::question(this,"提示","是否保存" );
    98. if(but==QMessageBox::StandardButton::Yes)
    99. {
    100. cont->ListToFile();
    101. }
    102. }
    103. void Widget::on_tableWidget_cellClicked(int row, int column)
    104. {
    105. showlistwidget( row);
    106. }
    107. void Widget::on_pushButtonSerch_clicked()
    108. {
    109. //获取关键字
    110. QString str=ui->lineEdit->text();
    111. //获得表格总行数
    112. int Row=ui->tableWidget->rowCount();
    113. //循环比较关键字和表格上的第二列
    114. for(int i=0;i
    115. {
    116. QString name=ui->tableWidget->item(i,1)->text();
    117. if(name==str)
    118. {
    119. //显示到列表框
    120. showlistwidget(i);
    121. ui->lineEdit->clear();
    122. return ;
    123. }
    124. }
    125. QMessageBox::information(this, "错误 ","请输入正确姓名");
    126. ui->lineEdit->clear();
    127. }
    128. void Widget::on_pushButtonDelete_clicked()
    129. {
    130. //这里实现了多选删除 (如:一次选择两行 一行选两个 2x2=4个)
    131. //不实现的话 一行选多个会报错 系统会重复删除该行
    132. QList qlst =ui->tableWidget->selectedItems();
    133. auto ite=qlst.begin();
    134. while(ite!=qlst.end())
    135. {
    136. int row=(*ite)->row();//获取单元格
    137. ite++;
    138. int Mark=-1;//删除判断标记
    139. if(ite!=qlst.end())//判断下一个是否为空
    140. {
    141. Mark=(*ite)->row();//把下一个赋给标记
    142. }
    143. if(row!=Mark)//不是一行的
    144. {
    145. //删除
    146. QString qstr=ui->tableWidget->item(row,0)->text();
    147. ui->tableWidget->removeRow(row);
    148. cont->Delete(qstr);
    149. }
    150. //是一行的
    151. //不操作 往下走
    152. ui->listWidget->clear();
    153. }
    154. }
    155. void Widget::on_tableWidget_cellChanged(int row, int column)
    156. {
    157. QString qstr=ui->tableWidget->item(row,column)->text();
    158. QMessageBox::StandardButton but;
    159. if(column==0)
    160. {
    161. QMessageBox::warning(this,"警告","不允许修改学号");
    162. }
    163. else
    164. {
    165. but= QMessageBox::question(this,"提示","是否修改学号为["+ui->tableWidget->item(row,0)->text()+"]的信息");
    166. //获取当前链表的学号为这个的节点
    167. }
    168. auto ite=cont->GetList().begin();
    169. while(ite!=cont->GetList().end())
    170. {
    171. if((*ite)->GetId()==ui->tableWidget->item(row,0)->text())
    172. {
    173. break ;
    174. }
    175. ite++;
    176. }
    177. if(but==QMessageBox::Yes)
    178. {
    179. switch(column)
    180. {
    181. case 1:
    182. (*ite)->SetName(qstr);
    183. break;
    184. case 2:
    185. (*ite)->SetSex(qstr);
    186. break;
    187. case 3:
    188. (*ite)->SetAge(qstr);
    189. break;
    190. case 4:
    191. (*ite)->SetMath(qstr);
    192. break;
    193. case 5:
    194. (*ite)->SetChinese(qstr);
    195. break;
    196. case 6:
    197. (*ite)->SetEnglish(qstr);
    198. break;
    199. }
    200. showlistwidget(row);
    201. }
    202. else
    203. {
    204. QObject::disconnect(ui->tableWidget,&QTableWidget::cellChanged,nullptr,nullptr);
    205. switch(column)
    206. {
    207. case 0:
    208. {
    209. QString id=ui->listWidget->item(0)->text();
    210. QStringList qlst=id.split(":");
    211. ui->tableWidget->item(row,0)->setText(qlst[1]);
    212. }
    213. break;
    214. case 1:
    215. ui->tableWidget->item(row,1)->setText((*ite)->GetName());
    216. break;
    217. case 2:
    218. ui->tableWidget->item(row,2)->setText((*ite)->GetSex());
    219. break;
    220. case 3:
    221. ui->tableWidget->item(row,3)->setText((*ite)->GetAge());
    222. break;
    223. case 4:
    224. ui->tableWidget->item(row,4)->setText((*ite)->GetMath());
    225. break;
    226. case 5:
    227. ui->tableWidget->item(row,5)->setText((*ite)->GetChinese());
    228. break;
    229. case 6:
    230. ui->tableWidget->item(row,6)->setText((*ite)->GetEnglish());
    231. break;
    232. }
    233. QObject::connect(ui->tableWidget,&QTableWidget::cellChanged,this,&Widget:: on_tableWidget_cellChanged);
    234. }
    235. }

  • 相关阅读:
    C++ 01
    【无标题】
    《痞子衡嵌入式半月刊》 第 56 期
    数据结构实验2
    AIGC实战——GPT(Generative Pre-trained Transformer)
    简单入门linux【一】初识linux
    递归实现 输出全排列
    简单自定义MVC优化
    用户代理字符串检测技术【2】
    springboot电气与信息类书籍网上书店 java ssm书籍借阅归还系统
  • 原文地址:https://blog.csdn.net/van9527/article/details/126015261