Qt教程——从零开始的学生管理系统(文件)
一、项目设计
1、需求分析
记录并处理学生成绩信息。
1)添加新的学生数据;
2)根据学号对已有的学生数据进行修改;
3)根据学号删除已存在的学生信息;
4)根据学号查询学生信息;
5)根据各门成绩与平均成绩进行排序。
2、窗口设计
1)菜单窗口;
2)添加学生窗口;
3)修改信息窗口(包括删除信息);
4)查询学生窗口
5)排序窗口;
3、数据结构设计
以一个类StudentInfo储存单个学生信息,学生类中包括:
姓名(字符串)
学号(整型)
数学成绩(整型)
英语成绩(整型)
C语言程序设计成绩(整型)
平均成绩(双浮点数)
二、项目制作
1、建立项目
打开Qt Creator 文件->新建文件或项目(Ctrl+N)->其他项目->空的Qt项目(Empty qmacke Project)
2、添加窗口
将其命名为StudentManagementSystem_Qt一路下一步到结束。
右击项目名称->Add New->Qt -> Qt设计师界面模板选择Widget下一步,我们当前建立的是菜单窗口,所以将其类名命名为MenuWidget一路下一步到结束。
以同样的方式建立添加学生窗口:AddStudentWidget、修改信息窗口:ModifyWidget、查询窗口:SelectWidget、排序窗口:SortWidget。
完成后的项目资源管理器页面中应该有如下文件
我们可以看到Qt中建立模板为widget的设计师界面就是建立了一个c++类(继承自QWidget)与其对应的ui文件 ,这个ui文件便是Qt Designer设计文件,它会在编译时生成一个ui_*.h文件,这样我们便可以用c++的方式对其进行调用。
之后打开我们的menuwidget.h,会发现其中存在错误。
这是因为我们的项目中没有连接Qt Widgets库,在StudentManagementSystem_Qt.pro中添加
QT += widgets
可解决问题。
3、实现窗口之间的切换
现在,就是实现我们新建立的几个窗口之间的窗口切换问题的时候了,这里我打算使用QStackedLayout实现窗口切换。
QStackedLayout继承自QLayout,提供了多页面切换的布局,一次只能看到一个界面,在我的Qt5——从零开始的Hello World教程(Qt Creator) 中提到过,大部分控件都继承自QFrame,而QFrame又继承自QWidget,所以QStackedLayout完全可以实现窗口之间的切换。
现在我们用与上一步相同的方法建立一个窗口MainWidget。并添加一个main.cpp来写main函数
在mainwidget.h中修改MainWidget的定义,为其添加成员
MenuWidget *menuwidget; //菜单窗口
AddStudentWidget *addstudentwidget; //添加学生窗口
SelectWidget *selectwidget; //查询窗口
ModifyWidget *modifywidget; //修改窗口
SortWidget *sortwidget; //排序窗口
QStackedLayout *stackLayout; //QStackedLayout布局
当然,也需要引用其对应的头文件。
#include #include"menuwidget.h"#include"addstudentwidget.h"#include"selectwidget.h"#include"modifywidget.h"#include"sortwidget.h"
在MainWidget.cpp中将MainWidget设为stackLayout布局,声明我们需要的窗口,并将其加入stackLayout布局中去。
在MainWidget.cpp中显示调用MainWidget构造函数。
MainWidget::MainWidget(QWidget *parent) :
QWidget(parent),
ui(newUi::MainWidget)
{
ui->setupUi(this);
}
处添加。
menuwidget = newMenuWidget;
addstudentwidget= newAddStudentWidget;
selectwidget= newSelectWidget;
modifywidget= newModifyWidget;
sortwidget= newSortWidget;
stackLayout= newQStackedLayout;
stackLayout->addWidget(menuwidget);
stackLayout->addWidget(addstudentwidget);
stackLayout->addWidget(selectwidget);
stackLayout->addWidget(modifywidget);
stackLayout->addWidget(sortwidget);
setLayout(stackLayout);
之后就需要使用Qt designer 设计页面了(当然在对应类中手动添加成员控件也没有任何问题)。
双击menuwidget.ui就打开了设计页面
在menuwidget中添加如下按钮(push button)
以同样的方法在addstudentwidget,selectwidget,modifywidget,sortwidget中都添加一个返回按钮returnButton。
为这些按钮设计点击槽函数。
menuwidget.h:privateslots:voidon_addButton_clicked();voidon_selectButton_clicked();voidon_modifyButton_clicked();voidon_sortButton_clicked();void on_exitButton_clicked();
还需要一个方法作为stackLayout切换页面的信号
signals:void display(int number);
在menuwidget.cpp中给出函数定义
voidMenuWidget::on_addButton_clicked(){
emit display(1);
}voidMenuWidget::on_selectButton_clicked(){
emit display(2);
}voidMenuWidget::on_modifyButton_clicked(){
emit display(3);
}voidMenuWidget::on_sortButton_clicked(){
emit display(4);
}voidMenuWidget::on_exitButton_clicked(){
QApplication::exit();
}
emit 把connect把信号和槽进行关联,emit某个信号,就相当于调用这个信号connect时所关联的槽函数。至于更多关于 emit信息诸位可以搜索或者看帮助文档。
之后为addstudentwidget,selectwidget,modifywidget,sortwidget窗口中的按钮设计信号与槽函数
在(类名).h中添加
signals:void display(intnumber);privateslots:void on_returnButton_clicked();
在(类名).cpp中添加
void(类名)::on_returnButton_clicked(){
emit display(0);
}
现在可以使用的只有退出按钮,跳转按钮还需要在mainwidget.cpp中用connect函数连接。
到此为止便完成了页面切换功能。
到次为止的源码:
4、完善窗口设计
1:AddStudentWidget
我们需要提示标签来指明输入的数据,也需要输入框来接收用户的输入,QLabel与QLineEdit可以满足我们的要求。
QLabel,QLineEdit有方法setText(“内容”)来改变其显示的文字,有方法setGeometry (起始横坐标,起始纵坐标,宽, 高)来设置左上角起始位置与大小。
当然这些都可以在Qt Designer中直接设置。打开addstudentwidget.ui。
根据之前设计的数据结构,需要nameLineEdit、idLineEdit、mathLineEdit、enLineEdit、cLineEdit五个QLineEdit接收学生的姓名、学号、数学成绩、英语成绩、C语言成绩(平均成绩由计算得出),需要nameLabel、idLabel、mathLabel、enLabel、cLabel五个QLabel提醒用户输入数据,需要addButton 一个QPushButton来添加学生。
最终将addstudentwidge