文章目录
- 前言
- 数据库设计
- 主要实现的功能
- 病人列表页面
- 病人信息页
- 信息录入页面
- 信息修改页面 & 信息查看页面
- 总结
前言
本次做的这个项目是医疗管理系统,是根据需求所定制的,因此只面向个人本地的使用。
本项目是本人在完全0基础的情况下边学边写,耗时2~3周完成的第一阶段医疗管理系统主要功能,所以如果有设计不合理的地方也欢迎大佬们指出。
本项目目前虽然是第一版,但是作为课程设计、期末大作业、毕业设计等,基本上没有问题的(注:不是直接抄,而是将QT作为入门,掌握开发流程后自己做出一个类似的系统),把页面修改美观一些即可。
数据库设计
由于sqlite3是QT内置的数据库,不需要在QT项目中附带安装其他数据库,而且sqlite3也是比较轻量的,非常适合这种数据量不是很大的个人使用的系统。
系统中可能会有多个医生使用,建立一张医生表:
create table doctor_info(id integer not null primary key autoincrement, name text, account text, password text);
在每个新病人就诊之前需要先录入其基本信息,建立一张病人基本信息表:
create table patient_base_info(id integer not null primary key autoincrement, name text not null, sex text, idcard text unique, address text, phone text unique);
由于需求中第一次就诊信息与后面再次就诊需要存储的信息内容有所不同(严格来说,是数据字段会多一些),当然可以不使用这样的建表方式,而是相同的提取成一张表,增加的内容新建在额外的一张表,但是考虑到那样的话会涉及到多表的联合查询,效率可能会比较慢(而且操作起来也不方便),因此,我这里是建立两张表,一张是只存储首次就诊信息表、一张是存储后面每次就诊的信息表:
create table patient_detail_first_info(id integer not null primary key autoincrement, pid integer not null, visit_time text, first_symptom text, first_age integer, elapsed_time text, height text, weight text, smoking_history text, previous_illnesses text, comorbidity text, thymic_disease text, myasthenia text, antibody_test text, blood_test text, technical_inspection text, scale_evaluation1 text, scale_evaluation2 text, diagnosis1 text, diagnosis2 text, treatment_plan text, MGFA text);
create table patient_detail_info(id integer not null primary key autoincrement, pid integer not null, visit_time text, symptom text, height text, weight text, comorbidity text, thymic_disease text, myasthenia text, antibody_test text, blood_test text, technical_inspection text, scale_evaluation1 text, scale_evaluation2 text, diagnosis1 text, diagnosis2 text, treatment_plan text, MGFA text);
上面是本项目需要建的数据库表,以下是一些用来测试插入数据的命令(用来看是否能正确操作):
insert into patient_base_info(name, sex, idcard, address, phone) values ('老二', '男', '9999', '广东省广州市白云区', '9999');
insert into patient_detail_first_info(pid, visit_time, first_symptom, first_age, elapsed_time, height, weight, smoking_history, previous_illnesses, comorbidity, thymic_disease, myasthenia, antibody_test, blood_test, technical_inspection, scale_evaluation1, scale_evaluation2, diagnosis1, diagnosis2, treatment_plan, MGFA) values (1, '2022-01-01', '肌无力', '30', '2天', '170', '62.2', '无', '无', '无', '未查', '无', '无', '无', '无', 'ciadbvsnvjsdkjbv', 'D:/测试图片.jpg', 'coivhdvnfvds', '', 'uivbdscnlanckslacnisodnv', '无');
insert into patient_detail_info(pid, visit_time, symptom, height, weight, comorbidity, thymic_disease, myasthenia, antibody_test, blood_test, technical_inspection, scale_evaluation1, scale_evaluation2, diagnosis1, diagnosis2, treatment_plan, MGFA) values (1, '2023-02-02', '肌无力', '170', '62.3', '无', '未查', '无', '无', '无', '无', 'dsvfbedfbd', '', 'csdvfrbfds', 'D:/测试图片.jpg', 'cdsijvbsdvds', '无干预');
所有有关数据库操作的代码:
//分页查询
QString("select * from patient_base_info limit %1 offset %2").arg(cnt).arg((page - 1) * cnt)
//病人人数查询
"select count(*) from patient_base_info"
//按名字模糊查询
"select count(*) from patient_base_info where name like '%" + name + "%'"
//按id查询病人
QString("select * from patient_base_info where id=%1").arg(id)
//插入病人基本信息
QString("insert into patient_base_info(name, sex, idcard, address, phone) values ('%1', '%2', '%3', '%4', '%5');")
.arg(user.name)
.arg(user.sex)
.arg(user.idcard)
.arg(user.address)
.arg(user.phone)
//删除病人基本信息
QString("delete from patient_base_info where id=%1").arg(id)
//更新病人基本信息
QString("update patient_base_info set name='%1',sex='%2',idcard='%3',address='%4',phone='%5' where id=%6")
.arg(user.name)
.arg(user.sex)
.arg(user.idcard)
.arg(user.address)
.arg(user.phone)
.arg(user.id)
//病人非首次详细信息的查询(根据病人id)
QString("select * from patient_detail_info where pid=%1").arg(id)
//病人首次详细信息的查询(根据病人id)
QString("select * from patient_detail_first_info where pid=%1").arg(id)
//病人非首次详细信息的查询(根据信息id)
QString("select * from patient_detail_info where id=%1").arg(id)
//病人首次详细信息的查询(根据信息id)
QString("select * from patient_detail_first_info where pid=%1").arg(id)
//按照信息id删除病人非首次详细信息
QString("delete from patient_detail_info where id=%1").arg(id)
//插入病人首次详细信息
QString("insert into patient_detail_first_info(pid, visit_time, first_symptom, first_age, elapsed_time, height, weight, smoking_history, previous_illnesses, comorbidity, thymic_disease, myasthenia, antibody_test, blood_test, technical_inspection, scale_evaluation1, scale_evaluation2, diagnosis1, diagnosis2, treatment_plan, MGFA) values (%1, '%2', '%3', '%4', '%5', '%6', '%7', '%8', '%9', '%10', '%11', '%12', '%13', '%14', '%15', '%16', '%17', '%18', '%19', '%20', '%21')")
.arg(id).arg(time).arg(symptom).arg(age).arg(passtime).arg(height).arg(weight)
.arg(smoke).arg(pill).arg(cill).arg(till).arg(mill).arg(antibody_path).arg(blood_path).arg(technical_path)
.arg(scale).arg(scale_path).arg(diagnosis).arg(diagnosis_path).arg(method).arg(MGFA)
//插入病人非首次详细信息
QString("insert into patient_detail_info(pid, visit_time, symptom, height, weight, comorbidity, thymic_disease, myasthenia, antibody_test, blood_test, technical_inspection, scale_evaluation1, scale_evaluation2, diagnosis1, diagnosis2, treatment_plan, MGFA) values (%1, '%2', '%3', '%4', '%5', '%6', '%7', '%8', '%9', '%10', '%11', '%12', '%13', '%14', '%15', '%16', '%17')")
.arg(id).arg(time).arg(symptom).arg(height).arg(weight)
.arg(cill).arg(till).arg(mill).arg(antibody_path).arg(blood_path).arg(technical_path)
.arg(scale).arg(scale_path).arg(diagnosis).arg(diagnosis_path).arg(method).arg(MGFA)
//更新病人首次详细信息内容
QString("update patient_detail_first_info set visit_time='%1', first_symptom='%2', first_age=%3, elapsed_time='%4', height='%5', weight='%6', smoking_history='%7', previous_illnesses='%8', comorbidity='%9', thymic_disease='%10', myasthenia='%11', antibody_test='%12', blood_test='%13', technical_inspection='%14', scale_evaluation1='%15', scale_evaluation2='%16', diagnosis1='%17', diagnosis2='%18', treatment_plan='%19', MGFA='%20' where pid=%21")
.arg(time).arg(symptom).arg(age).arg(passtime).arg(height).arg(weight)
.arg(smoke).arg(pill).arg(cill).arg(till).arg(mill).arg(antibody_path).arg(blood_path).arg(technical_path)
.arg(scale).arg(scale_path).arg(diagnosis).arg(diagnosis_path).arg(method).arg(MGFA).arg(id)
//更新病人非首次详细信息的内容
QString("update patient_detail_info set visit_time='%1', symptom='%2', height='%3', weight='%4', comorbidity='%5', thymic_disease='%6', myasthenia='%7', antibody_test='%8', blood_test='%9', technical_inspection='%10', scale_evaluation1='%11', scale_evaluation2='%12', diagnosis1='%13', diagnosis2='%14', treatment_plan='%15', MGFA='%16' where id=%17")
.arg(time).arg(symptom).arg(height).arg(weight)
.arg(cill).arg(till).arg(mill).arg(antibody_path).arg(blood_path).arg(technical_path)
.arg(scale).arg(scale_path).arg(diagnosis).arg(diagnosis_path).arg(method).arg(MGFA).arg(id)
主要实现的功能
在该项目中主要实现了分页、新增病人、搜索病人、点击病人头像跳转详情页、新增/删除/修改信息、图片上传等功能,其中设计到的主要操作如下:
//查询总人数
int getUserCnt();
//查询搜索的人
int getUserCntByName(QString name);
//查询用户信息
User getUserById(int id);
//查询第几页的数据
QList<User> getPageUser(int page, int cnt);
//增加用户
bool addUser(User user);
//删除用户
bool delUser(int id);
//更新用户信息
bool updateUser(User user);
//查询用户的详细信息
QList<Info> getAllInfoById(int id);
//查询用户首次信息
Info getFirstInfoById(int id);
//查询用户非首次的单条信息
Info getInfoById(int id);
//查询是否存在该用户的信息
bool isExistFirstInfo(QString id);
//删除用户非首次的单条信息
bool delInfoById(QString id);
//添加用户首次信息
bool addFirstInfoById(QString id, QString time, QString symptom, QString age, QString passtime, QString height, QString weight, QString smoke, QString pill, QString cill, QString till, QString mill, QString antibody_path, QString blood_path, QString technical_path, QString scale, QString scale_path, QString diagnosis, QString diagnosis_path, QString method, QString MGFA);
//添加用户非首次信息
bool addInfoById(QString id, QString time, QString symptom, QString height, QString weight, QString cill, QString till, QString mill, QString antibody_path, QString blood_path, QString technical_path, QString scale, QString scale_path, QString diagnosis, QString diagnosis_path, QString method, QString MGFA);
//更新用户首次信息
bool updateFirstInfoById(QString id, QString time, QString symptom, QString age, QString passtime, QString height, QString weight, QString smoke, QString pill, QString cill, QString till, QString mill, QString antibody_path, QString blood_path, QString technical_path, QString scale, QString scale_path, QString diagnosis, QString diagnosis_path, QString method, QString MGFA);
//更新用户非首次信息
bool updateInfoById(QString id, QString time, QString symptom, QString height, QString weight, QString cill, QString till, QString mill, QString antibody_path, QString blood_path, QString technical_path, QString scale, QString scale_path, QString diagnosis, QString diagnosis_path, QString method, QString MGFA);
病人列表页面
在这个页面中,分页、新增、搜索的按钮功能实现起来都是比较简单,都是直接ui设计后转到槽,连一下数据库操作即可。比较困难的地方是中心的列表,因为不能进行ui拖拽等的固定设计(原因是在最后一页中病人数量可能是不满30的,只能够显示几个病人,包括在搜索结果的显示等,都是不固定的),所以需要使用代码来实现。
实现步骤:
(1)创建出一个列表框,并指定框中的各项参数。
//设置QListWidget的显示模式
ui->listWidget->setViewMode(QListView::IconMode);
//设置QListWidget中单元项的图片大小
ui->listWidget->setIconSize(QSize(120,120));
//设置QListWidget中单元项的间距
ui->listWidget->setSpacing(22);
//设置自动适应布局调整(Adjust适应,Fixed不适应),默认不适应
ui->listWidget->setResizeMode(QListWidget::Adjust);
//设置不能移动
ui->listWidget->setMovement(QListWidget::Static);
(2)由于我们规定了一页中显示30个,图片大小、间距等也是固定的,特别是代码进行编写很难实现到内部的自适应功能,所以在对页面进行放大和缩小的时候就可能会出现列表框格式变得非常奇怪的问题。因此,我这里的解决方法是直接规定一个固定且合适的大小(也就是说,使用者不能够对这个框进行放大或缩小)
int width = 1500;
int height = 900;
this->setFixedSize(width,height);
(3)实现图片内容的显示以及点击跳转(也就是点击事件连接对应的用户)
connect(ui->listWidget,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(listWidgetClicked(QListWidgetItem*)));
void MainWindow::listWidgetClicked(QListWidgetItem *item)
{
qDebug() << item->statusTip() << " " << ui->listWidget->currentIndex().row() << " " << ui->listWidget->count();
int id = item->statusTip().toInt();
User user = getUserById(id);
us.load(user);
Info info = getFirstInfoById(id);
us.load(info);
QList<Info> list = getAllInfoById(id);
us.load(list);
us.showMaximized();
}
病人信息页
在病人列表页面点击进来之后就会显示对应用户的信息,在这个页面中,我设计为左右两栏:左边栏是一个选择列表,选择tree list下对应的地方(本项目目前只有基本信息以及诊断结果界面,后续会新增新的功能)就会在右边栏中显示出该病人对应的信息界面。
当前,左边栏部分既可以使用代码实现也可以使用ui界面设计实现(这里介绍一个使用得比较多的方法),首先在ui界面设计中拉出一个treeWidget控件,创建pf表示父节点(患者信息管理)以及两个子节点(基本信息、诊断结果),代码如下(并使用expandAll函数来默认显示打开全部):
ui->treeWidget->clear();
ui->treeWidget->setColumnCount(1);
QStringList list;
list << "患者信息管理";
//ui->treeWidget->addTopLevelItem(new QTreeWidgetItem(ui->treeWidget, list));
QTreeWidgetItem *pf = new QTreeWidgetItem(ui->treeWidget, list);
ui->treeWidget->addTopLevelItem(pf);
list.clear();
list << "基本信息";
QTreeWidgetItem *p1 = new QTreeWidgetItem(pf, list);
list.clear();
list << "诊断结果";
QTreeWidgetItem *p2 = new QTreeWidgetItem(pf, list);
pf->addChild(p1);
pf->addChild(p2);
ui->treeWidget->expandAll();
void userSql::on_treeWidget_itemClicked(QTreeWidgetItem *item, int column)
{
if(item->text(column) == "基本信息")
{
ui->stackedWidget->setCurrentWidget(ui->page_baseData);
}
if(item->text(column) == "诊断结果")
{
ui->stackedWidget->setCurrentWidget(ui->page_detailData);
}
}
接下来就是加载页面数据,加载页面的时候不仅需要加载基本信息,同时需要加载诊断结果(严格来说需要加载三部分:基本信息、首次详细信息、非首次详细信息):
//加载非首次详细信息(存在多行数据,需要使用QList来存储)
userSql::load(QList<Info> list)
{
ui->tableWidget2->setRowCount(list.size());
// connect(button, SIGNAL(clicked()), this, SLOT(OnBtnClicked()));
int k = 2;
for(int i = 0; i < list.size(); i++)
{
ui->tableWidget2->setItem(i, 0, new QTableWidgetItem("第" + QString::number(k++) + "次就诊"));
ui->tableWidget2->setItem(i, 1, new QTableWidgetItem(list[i].visit_time));
ui->tableWidget2->setItem(i, 2, new QTableWidgetItem(list[i].first_symptom));
ui->tableWidget2->setItem(i, 3, new QTableWidgetItem(list[i].height));
ui->tableWidget2->setItem(i, 4, new QTableWidgetItem(list[i].weight));
ui->tableWidget2->setItem(i, 5, new QTableWidgetItem(list[i].comorbidity));
ui->tableWidget2->setItem(i, 6, new QTableWidgetItem(list[i].thymic_disease));
ui->tableWidget2->setItem(i, 7, new QTableWidgetItem(list[i].myasthenia));
// ui->tableWidget2->setItem(i, 8, new QTableWidgetItem(list[i].antibody_test));
button = new QPushButton();
button->setText("点击查看");
button->adjustSize();
// button->setFixedSize(80, 30);
button->setStyleSheet("background-color:white");
connect(button, SIGNAL(clicked(bool)), this, SLOT(clickButton_antibody1()));
ui->tableWidget2->setCellWidget(i, 8, button);
// ui->tableWidget2->setItem(i, 9, new QTableWidgetItem(list[i].blood_test));
button = new QPushButton();
button->setText("点击查看");
button->adjustSize();
// button->setFixedSize(80, 30);
button->setStyleSheet("background-color:white");
connect(button, SIGNAL(clicked(bool)), this, SLOT(clickButton_blood1()));
ui->tableWidget2->setCellWidget(i, 9, button);
// ui->tableWidget2->setItem(i, 10, new QTableWidgetItem(list[i].technical_inspection));
button = new QPushButton();
button->setText("点击查看");
button->adjustSize();
// button->setFixedSize(80, 30);
button->setStyleSheet("background-color:white");
connect(button, SIGNAL(clicked(bool)), this, SLOT(clickButton_tec1()));
ui->tableWidget2->setCellWidget(i, 10, button);
// ui->tableWidget2->setItem(i, 11, new QTableWidgetItem(list[i].scale_evaluation1));
button = new QPushButton();
button->setText("点击查看");
button->adjustSize();
// button->setFixedSize(80, 30);
button->setStyleSheet("background-color:white");
connect(button, SIGNAL(clicked(bool)), this, SLOT(clickButton1()));
ui->tableWidget2->setCellWidget(i, 11, button);
// ui->tableWidget2->setItem(i, 12, new QTableWidgetItem(list[i].diagnosis1));
button = new QPushButton();
button->setText("点击查看");
button->adjustSize();
// button->setFixedSize(80, 30);
button->setStyleSheet("background-color:white");
connect(button, SIGNAL(clicked(bool)), this, SLOT(clickButton_diagnosis1()));
ui->tableWidget2->setCellWidget(i, 12, button);
ui->tableWidget2->setItem(i, 13, new QTableWidgetItem(list[i].treatment_plan));
ui->tableWidget2->setItem(i, 14, new QTableWidgetItem(list[i].MGFA));
ui->tableWidget2->setItem(i, 15, new QTableWidgetItem(QString::number(list[i].id)));
qDebug() << list[i].id;
for(int j = 0; j <= 15; j++)
{
if(j == 8 || j == 9 || j == 10 || j == 11 || j == 12) continue;
ui->tableWidget2->item(i, j)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
}
}
}
//加载首次详细信息(只存在一条信息,直接将其加载出来即可)
userSql::load(Info info)
{
if(QString::compare(info.visit_time, "") == 0 && QString::compare(info.first_symptom, "") == 0 && QString::compare(info.elapsed_time, "") == 0
&& QString::compare(info.height, "") == 0 && QString::compare(info.weight, "") == 0 && QString::compare(info.smoking_history, "") == 0
&& QString::compare(info.previous_illnesses, "") == 0 && QString::compare(info.comorbidity, "") == 0 && QString::compare(info.thymic_disease, "") == 0
&& QString::compare(info.myasthenia, "") == 0 && QString::compare(info.antibody_test, "") == 0 && QString::compare(info.blood_test, "") == 0
&& QString::compare(info.technical_inspection, "") == 0 && QString::compare(info.scale_evaluation1, "") == 0 && QString::compare(info.scale_evaluation2, "") == 0
&& QString::compare(info.diagnosis1, "") == 0 && QString::compare(info.diagnosis2, "") == 0 && QString::compare(info.treatment_plan, "") == 0 && QString::compare(info.MGFA, "") == 0
&& info.age == 0)
{
ui->tableWidget1->setRowCount(0);
}
else
{
ui->tableWidget1->setRowCount(1);
ui->tableWidget1->setItem(0, 0, new QTableWidgetItem("第1次就诊"));
ui->tableWidget1->setItem(0, 1, new QTableWidgetItem(info.visit_time));
ui->tableWidget1->setItem(0, 2, new QTableWidgetItem(info.first_symptom));
ui->tableWidget1->setItem(0, 3, new QTableWidgetItem(QString::number(info.age)));
ui->tableWidget1->setItem(0, 4, new QTableWidgetItem(info.elapsed_time));
ui->tableWidget1->setItem(0, 5, new QTableWidgetItem(info.height));
ui->tableWidget1->setItem(0, 6, new QTableWidgetItem(info.weight));
ui->tableWidget1->setItem(0, 7, new QTableWidgetItem(info.smoking_history));
ui->tableWidget1->setItem(0, 8, new QTableWidgetItem(info.previous_illnesses));
ui->tableWidget1->setItem(0, 9, new QTableWidgetItem(info.comorbidity));
ui->tableWidget1->setItem(0, 10, new QTableWidgetItem(info.thymic_disease));
ui->tableWidget1->setItem(0, 11, new QTableWidgetItem(info.myasthenia));
// ui->tableWidget1->setItem(0, 12, new QTableWidgetItem(info.antibody_test));
button = new QPushButton();
button->setText("点击查看");
button->adjustSize();
// button->setFixedSize(80, 30);
button->setStyleSheet("background-color:white");
connect(button, SIGNAL(clicked(bool)), this, SLOT(clickButton_antibody2()));
ui->tableWidget1->setCellWidget(0, 12, button);
// ui->tableWidget1->setItem(0, 13, new QTableWidgetItem(info.blood_test));
button = new QPushButton();
button->setText("点击查看");
button->adjustSize();
// button->setFixedSize(80, 30);
button->setStyleSheet("background-color:white");
connect(button, SIGNAL(clicked(bool)), this, SLOT(clickButton_blood2()));
ui->tableWidget1->setCellWidget(0, 13, button);
// ui->tableWidget1->setItem(0, 14, new QTableWidgetItem(info.technical_inspection));
button = new QPushButton();
button->setText("点击查看");
button->adjustSize();
// button->setFixedSize(80, 30);
button->setStyleSheet("background-color:white");
connect(button, SIGNAL(clicked(bool)), this, SLOT(clickButton_tec2()));
ui->tableWidget1->setCellWidget(0, 14, button);
// ui->tableWidget1->setItem(0, 15, new QTableWidgetItem(info.scale_evaluation1));
button = new QPushButton();
button->setText("点击查看");
button->adjustSize();
// button->setFixedSize(80, 30);
button->setStyleSheet("background-color:white");
connect(button, SIGNAL(clicked(bool)), this, SLOT(clickButton2()));
ui->tableWidget1->setCellWidget(0, 15, button);
// ui->tableWidget1->setItem(0, 16, new QTableWidgetItem(info.diagnosis1));
button = new QPushButton();
button->setText("点击查看");
button->adjustSize();
// button->setFixedSize(80, 30);
button->setStyleSheet("background-color:white");
connect(button, SIGNAL(clicked(bool)), this, SLOT(clickButton_diagnosis2()));
ui->tableWidget1->setCellWidget(0, 16, button);
ui->tableWidget1->setItem(0, 17, new QTableWidgetItem(info.treatment_plan));
ui->tableWidget1->setItem(0, 18, new QTableWidgetItem(info.MGFA));
for(int i = 0; i <= 18; i++)
{
if(i == 12 || i == 13 || i == 14 || i == 15 || i == 16) continue;
ui->tableWidget1->item(0, i)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
}
}
}
//加载基本信息
userSql::load(User user)
{
ui->textEdit->clear();
ui->label_image->clear();
qDebug() << "load...";
ui->lb_id->clear();
ui->lb_name->clear();
ui->lb_sex->clear();
ui->lb_idcard->clear();
ui->lb_address->clear();
ui->lb_phone->clear();
id = QString::number(user.id);
name = user.name;
sex = user.sex;
idcard = user.idcard;
address = user.address;
phone = user.phone;
ui->lb_id->setText(id);
ui->lb_name->setText(name);
ui->lb_sex->setText(sex);
ui->lb_idcard->setText(idcard);
ui->lb_address->setText(address);
ui->lb_phone->setText(phone);
ui->stackedWidget->setCurrentWidget(ui->page_baseData);
}
获取点击事件并显示相关内容功能,这是一个比较实用的功能,可以用来将点击的数据获取并显示在文本框中,更加方便查看以及复制等操作。
void userSql::on_tableWidget1_clicked(const QModelIndex &index)
{
ui->textEdit->clear();
ui->label_image->clear();
ui->textEdit->setText(index.data().toString());
IID = index.sibling(index.row(), 15).data().toString();
}
void userSql::on_tableWidget2_clicked(const QModelIndex &index)
{
ui->textEdit->clear();
ui->label_image->clear();
ui->textEdit->setText(index.data().toString());
IID = index.sibling(index.row(), 15).data().toString();
}
当然,实现点击获取到对应内容不仅仅只包含这样,因为有一些列是同时包含两个字段的(文本+图片),这时候就不能单纯地获取点击框中的数据,而是应该分开来显示,在文本框中显示文本、图片框中显示图片,那么就可以选择使用按钮来实现这个功能,以一个按钮来进行举例:
button = new QPushButton();
button->setText("点击查看");
button->adjustSize();
button->setStyleSheet("background-color:white");
connect(button, SIGNAL(clicked(bool)), this, SLOT(clickButton1()));
ui->tableWidget2->setCellWidget(i, 11, button);
void userSql::clickButton1()
{
ui->textEdit->clear();
ui->label_image->clear();
QPushButton *pushButton_ = dynamic_cast<QPushButton*>(this->sender());
if(NULL == pushButton_)
{
return;
}
int x = pushButton_->frameGeometry().x();
int y = pushButton_->frameGeometry().y();
QModelIndex index = ui->tableWidget2->indexAt(QPoint(x, y));
int row = index.row();
int column = index.column();
qDebug() << "选择第几行:" << row << "选择第几列:" << column;
//接下来自定义要处理的
QString ID = index.sibling(row, 15).data().toString();
IID = ID;
auto ptr = MainWindow::getinstance();
Info info = ptr->getInfoById(ID.toInt());
ui->textEdit->setText(info.scale_evaluation1);
QImage image;
QString path = info.scale_evaluation2;
qDebug() << path;
image.load(path);
QPixmap pixmap = QPixmap::fromImage(image);
int width = ui->label_image->width();
int height = ui->label_image->height();
QPixmap fitpixmap = pixmap.scaled(width, height, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->label_image->setPixmap(fitpixmap);
ptr = nullptr;
}
以上代码其实使用了一个比较取巧的做法QString ID = index.sibling(row, 15).data().toString();
,因为我们存的是第n条信息,但是在数据库中其实并不是第n条信息,我们其实应该是要获取到该条信息的id后再进行查找,因此我直接将信息id作为编号存到表格中的最后一列中,每次就先去到这个编号再进行后面的操作(类似这样的操作在后面功能的实现还能见到很多)。
信息录入页面
这部分虽然工作量是最庞大的,但是很多都是重复性的工作,所以难度并不大,ui的设计比较有意思,我这个设置点击无就不显示单选或多选框,点击有才会出现,在最后提交的时候获取这些填写信息并存到数据库中即可。
信息修改页面 & 信息查看页面
这两个页面是比较相像的,都是需要在数据库中查找对应的数据并且加载到界面中,只是加载之后的布局不一样,以及能否进行修改操作这两个区别,所以主要功能代码基本上是一样的,但是需要制作不同的ui界面。
还有一点需要说的是:我这里图片存储在数据库中是直接存储图片本地的路径(而非二进制存储),加载的时候也是直接从本地对应路径加载上来,因此存储图片不能进行移动或者删除,否则会获取不到图片。二进制存储图片则不会存在这种情况,但是会比较占空间。
总结
以上是本人花费三周边学边写的成果,虽然界面效果以及部分功能还是比较粗糙,但是总体来说还是比较满意的~
当然,这只是第一版,这里有一个需要改进的地方:在添加详细信息、修改详细信息之后,不能实时更新界面内容,而是需要额外点击刷新按钮才能进行刷新显示,造成这样的原因是我创建了mainwindow的界面(做的时候不清楚mainwindow和dialog之间的区别),mainwindow界面没有阻塞的作用,无法进行阻塞等待,而像前面创建的新增病人界面使用的就是dialog界面,它是可以做到实时更新的。对于为什么我不直接修改成dialog界面的这个问题,我想说的是并不是想象中的那么简单,需要重新编写ui界面等,很多代码需要推翻重写。也就是因为我想重写这个,不小心删错一个文件,导致整个程序运行不起来(一度以为要对整个项目进行重构),还好最后凭借记忆强行复原回来,经历这个事件之后,本人现在没写完一个功能之后都会进行一下提交到代码仓库(血的教训,因为在编写Java项目的时候使用的是idea,提交比较方便就有习惯commit,QT还需要用小乌龟或者命令行来提交就比较麻烦)。
最后说一下本项目后面要添加的几个功能:
(1)增加图片识别提取文字功能,目前思路:使用现成的ocr来实现,但是ocr只在高版本的QT中有引入,所以在实现的时候需要换QT版本(会存在不兼容的情况,比较麻烦)。
(2)增加数据分析生成图表的功能,根据图标中线的走向来辅助使用者进行更直观的分析等(这部分领域在使用完全没有接触过,这部分耗时可能会比较多)。