程序使用Qt5编写了一个学生管理系统
首先介绍一下项目框架,项目包含一个主窗口mainwindow
Mainwindow使用的就是最常见的Mainwindow带对话框的,带标题栏等等的窗口
两个子窗口(一个学生信息录入界面,一个学生信息查询界面),这两个窗口都是dialog without buttons的dialog窗口
下面截图是程序pro的框架,类Mianwindow是主窗口,类dialog是录入信息窗口,类query是查询窗口。
小程序使用到的主要控件:
- Qlabel
- QLineEdit
- QRadioButton
- QComboBox
- QCheckBox
- QPushButton
- QTable View(这个稍微复杂一点,其余都很基础)
附上我写基本过程和这个小程序源码
首先我先写的录入学生信息界面,ui源码量太大,我就不写了,需要的可以给我发邮件[email protected]
下面贴上 dialog.h源码
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QString>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
void clear_interface();
void writetofile(QString cnt);
private slots:
void on_btn_ok_clicked();
void on_btn_cancel_clicked();
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H
下面贴上dialog.cpp源码
#include "dialog.h"
#include "ui_dialog.h"
#include <QMessageBox>
#include <QList>
#include <QAbstractButton>
#include <QCheckBox>
#include <QFile>
#include <QTextStream>
#include <QIODevice>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::on_btn_ok_clicked()
{
QString name = this->ui->le_name->text();
QString id = this->ui->le_id->text();
QString sex = this->ui->sexGroup->checkedButton()->text();
QString age = this->ui->cbb_age->currentText();
QString faculty=this->ui->cbb_collage->currentText();
QList<QAbstractButton *>ins_list=this->ui->insGroup->buttons();
QString ins;
int i = 0;
for (i = 0;i<ins_list.length();i++){
QAbstractButton *che =ins_list.at(i);
if (che->isChecked()){
ins +=che->text()+" ";
}
}
QString content;
content = name+'\n'+id+'\n'+age+'\n'+sex+'\n'+faculty+'\n'+ins;
QString cnt;
cnt = name+" "+id+" "+age+" "+sex+" "+faculty+" "+ins+'\n';
if (name.length()<1 ||id.length()<8){
QMessageBox::critical(this,"错误","信息填写不完整","确定");
}
else{
int ret = QMessageBox::question(this,"please confirm information",content,"确定","取消");
if (ret == 0){
clear_interface();
writetofile(cnt);
}
}
// msgBox.setText("请确认信息.");
// msgBox.setInformativeText(name +'\n'+ id );
// //msgBox.setStandardButtons(QMessageBox::Save| QMessageBox::Discard | QMessageBox::Cancel);
// //msgBox.setDefaultButton(QMessageBox::Save);
// msgBox.addButton("确定", QMessageBox::AcceptRole);
// msgBox.addButton("取消", QMessageBox::RejectRole);
// int ret = msgBox.exec();
}
void Dialog::clear_interface()
{
this->ui->le_name->clear();
this->ui->le_id->clear();
this->ui->radioButton_man->setChecked(true);
this->ui->cbb_age->setCurrentIndex(0);
this->ui->cbb_collage->setCurrentIndex(0);
QList<QAbstractButton *>ins_list = this->ui->insGroup->buttons();
int i = 0;
for (i = 0;i <ins_list.length();i++){
QAbstractButton *box = ins_list.at(i);
box->setChecked(false);
}
}
void Dialog::writetofile(QString cnt)
{
QFile file("stu.txt");
if(! file.open(QIODevice::Append | QIODevice::Text)){
QMessageBox::critical(this,"错误","文件打开失败","确认");
return;
}
QTextStream out(&file);
out<<cnt;
file.close();
}
void Dialog::on_btn_cancel_clicked()
{
this->close();
}
然后我写的是主界面,这个很简单,拖几个控件就可以
下面是mainwindow.h文件源码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_actionaddStu_triggered();
void on_actionqueryStu_triggered();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
下面是mianwindow.cpp源码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
#include "query.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_actionaddStu_triggered()
{
Dialog a;
// a.show();
a.exec();
}
void MainWindow::on_actionqueryStu_triggered()
{
Query b;
b.exec();
}
最后是查询界面源码,query源码,首先是query.h
#ifndef QUERY_H
#define QUERY_H
#include <QDialog>
#include <QFile>
#include <QList>
#include <QString>
#include <QStandardItem>
#include <QStandardItemModel>
namespace Ui {
class Query;
}
class Query : public QDialog
{
Q_OBJECT
public:
explicit Query(QWidget *parent = 0);
~Query();
int readFromFile();
void doquery(int index,QString cnt);
void display(int row,QStringList subs);
private slots:
void on_btn_search_clicked();
private:
Ui::Query *ui;
QList<QString> stu_lines;
QStandardItemModel *model;
};
#endif // QUERY_H
接下来是Query.cpp源码
#include "query.h"
#include "ui_query.h"
#include <QMessageBox>
#include <QTextStream>
#include <QDebug>
Query::Query(QWidget *parent) :
QDialog(parent),
ui(new Ui::Query)
{
ui->setupUi(this);
if (readFromFile() == -1){
QMessageBox::warning(this,"严重错误","文件打开失败");
this->close();
}
this->model = new QStandardItemModel;
//设置表头
this->ui->tableView->setModel(model);
}
Query::~Query()
{
delete ui;
}
int Query::readFromFile()
{
QFile file("stu.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){
// QMessageBox::critical(this,"错误","文件读取失败","确认");
return -1;
}
QTextStream in(&file);
while (!in.atEnd()) {
QString line = in.readLine();
this->stu_lines.append(line);
}
file.close();
return 0;
}
void Query::on_btn_search_clicked()
{
this->model->clear();
this->model->setHorizontalHeaderItem(0,new QStandardItem("姓名"));
this->model->setHorizontalHeaderItem(1,new QStandardItem("学号"));
this->model->setHorizontalHeaderItem(2,new QStandardItem("性别"));
this->model->setHorizontalHeaderItem(3,new QStandardItem("年龄"));
this->model->setHorizontalHeaderItem(4,new QStandardItem("院系"));
this->model->setHorizontalHeaderItem(5,new QStandardItem("兴趣"));
this->ui->tableView->setColumnWidth(0,50);
this->ui->tableView->setColumnWidth(1,200);
this->ui->tableView->setColumnWidth(2,50);
this->ui->tableView->setColumnWidth(3,50);
this->ui->tableView->setColumnWidth(4,100);
this->ui->tableView->setColumnWidth(5,300);
int index = this->ui->cbb->currentIndex();
QString cnt = this->ui->le_cnt->text();
doquery(index,cnt);
}
void Query::doquery(int index, QString cnt)
{
int i = 0;
int row = 0;
for (i=0;i<stu_lines.length();i++){
QString line = stu_lines.at(i);
line = line.trimmed();
QStringList list = line.split(" ");
switch (index) {
case 1:
if (cnt == list.at(0)){
display(row++,list);
}
break;
case 2:
if (cnt == list.at(1)){
display(row++,list);
}
break;
case 3:
if (cnt == list.at(4)){
display(row++,list);
}
break;
default:
break;
}
}
}
void Query::display(int row, QStringList subs)
{
int i = 0;
for(i = 0;i<5;i++){
this->model->setItem(row,i,new QStandardItem(subs.at(i)));
}
QString ins;
for(int i=5;i<subs.length();i++){
ins+=subs.at(i)+" ";
}
this->model->setItem(row,5,new QStandardItem(ins));
}
最后是main函数.cpp源码
#include "dialog.h"
#include <QApplication>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
程序稍微需要一些新知识的有两个方面
- Qt的容器相关概念,这个可以看帮助文档
这里把这个项目用的容器在这里说明一下:
QList是一个容器类,<QAbstractButton *>代表的是容器类里面存储元素的类型,然后ins_list代表的是,我理解为列表名称,然后就是通过Qt中的at方法读取第几个列表元素,然后进行拼接字符串操作。
QList<QAbstractButton *>ins_list=this->ui->insGroup->buttons();
QString ins;
int i = 0;
for (i = 0;i<ins_list.length();i++){
QAbstractButton *che =ins_list.at(i);
if (che->isChecked()){
ins +=che->text()+" ";
}
后面在查询的时候也使用了一次容器类
QList<QString> stu_lines;
这个是在query.h中的privite的私有变量中定义的。
然后在query.cpp里可以直接用了
while (!in.atEnd()) { QString line = in.readLine(); this->stu_lines.append(line); }
2 .控件中的table view使用:
table view是基于MVC框架设计的。
表格中一个小格属于QStandardItem类
一个整个表格属于QStandardItemModel
我们在.h文件中定义一个privite变量QStandardItemModel *model
然后在构造函数中实例化一个变量
this->model = new QStandardItemModel;
有了这个model指针对象后,就可以使用model的一些内容函数;
如设置表头setHorizontalHeaderItem(int 列,内容)
this->model->setHorizontalHeaderItem(0,new QStandardItem("姓名"));
this->model->setHorizontalHeaderItem(1,new QStandardItem("学号"));
this->model->setHorizontalHeaderItem(2,new QStandardItem("性别"));
this->model->setHorizontalHeaderItem(3,new QStandardItem("年龄"));
this->model->setHorizontalHeaderItem(4,new QStandardItem("院系"));
this->model->setHorizontalHeaderItem(5,new QStandardItem("兴趣"));
管理外观的,使用table view自己的函数
this->ui->tableView->setColumnWidth(0,50);
this->ui->tableView->setColumnWidth(1,200);
this->ui->tableView->setColumnWidth(2,50);
this->ui->tableView->setColumnWidth(3,50);
this->ui->tableView->setColumnWidth(4,100);
this->ui->tableView->setColumnWidth(5,300);
最后在把管理内容的model,显示在table view中
this->ui->tableView->setModel(model)this->ui->tableView->setModel(model)```
这就是典型的MVC思想。与上一篇博客中计算器使用类似
大家有问题可以相互交流,共同进步,本人就是编程小白一个。
我的邮箱是 [email protected]