【C++开发】基于QT+sqlite3的医疗管理系统

news2024/11/14 0:14:04

文章目录

  • 前言
  • 数据库设计
  • 主要实现的功能
    • 病人列表页面
    • 病人信息页
    • 信息录入页面
    • 信息修改页面 & 信息查看页面
  • 总结

前言

        本次做的这个项目是医疗管理系统,是根据需求所定制的,因此只面向个人本地的使用。
        本项目是本人在完全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)增加数据分析生成图表的功能,根据图标中线的走向来辅助使用者进行更直观的分析等(这部分领域在使用完全没有接触过,这部分耗时可能会比较多)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/480088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

14-2-进程间通信-FIFO

一、命名管道FIFO 1.作用范围 对于命名管道FIFO&#xff0c;它可以在不相关的进程间也能相互通信。 2.命名管道可左右用于不相关进程的原因 因为命令管道&#xff0c;提前创建了一个类型为管道的设备文件&#xff0c;在进程里只要使用这个设备文件&#xff0c;就可以相互通信…

14-1-进程间通信-pipe

一.无名管道pipe 特点&#xff1a; (1)半双工&#xff08;在同一时刻&#xff0c;数据传输的方向只能是接收或发送&#xff09;&#xff1b; 例如&#xff1a;对于主机和从机而言&#xff0c;在某一时刻&#xff0c;只能是主机发送&#xff08;从机接收&#xff09;&#xff0…

CentOS+nginx手动搭建WordPress

文章目录 前提条件php安装安装 EPEL 源及源管理工具&#xff1a;安装 REMI 源&#xff1a;安装 PHP7.3 及扩展&#xff1a;设置开机自动启动其他php命令 wordpress 安装下载WordPress将下载的WordPress移动至网站根目录修改WordPress配置文件配置nginx 创建完成后根据域名访问 …

分析linux中动态库so文件的常用方法

前言 在linux系统中&#xff0c;我们经常会遇到各种各样的动态库文件&#xff0c;常见的是.so后缀&#xff0c;那么我们应该如何分析这些文件的用途和作用呢&#xff1f;毕竟我们不能一知半解的“搞事情”。 正文 查看文件属性 首先&#xff0c;我们从整体上了解一下该文件的基…

maven-gpg-plugin gpg禁用交互式输入密码 免密码输入 设置默认密码 关闭pinentry-qt输入 passphrase

一、问题描述 在使用maven-gpg-plugin打包jar时,默认情况下&#xff0c;每次都会弹出对话框要你输入密码&#xff1a; 这就有点烦&#xff0c;有啥办法可以设置默认方法没&#xff1f;网上找了一圈&#xff0c;通过搜索关键词“passphrase”&#xff0c;找到了一些教程&#x…

无损以太网与网络拥塞管理(PFC、ECN)

无损以太网 无损以太网&#xff08;Lossless Ethernet&#xff09;是一种专门用于数据中心网络的网络技术&#xff0c;旨在提供低延迟、高吞吐量和可靠性的传输服务。它是在传统以太网的基础上进行了扩展&#xff0c;引入了新的拥塞管理机制&#xff0c;以避免数据包丢失和网络…

探索【Stable-Diffusion WEBUI】的插件:ControlNet 1.1

文章目录 &#xff08;零&#xff09;前言&#xff08;二&#xff09;ControlNet&#xff08;v1.1&#xff09;&#xff08;2.1&#xff09;模型&#xff08;2.2&#xff09;新版界面&#xff08;2.3&#xff09;预处理器 &#xff08;三&#xff09;偷懒 &#xff08;零&#…

机器学习与深度学习——通过决策树算法分类鸢尾花数据集iris求出错误率画出决策树并进行可视化

什么是决策树&#xff1f; 决策树是一种常用的机器学习算法&#xff0c;它可以对数据集进行分类或回归分析。决策树的结构类似于一棵树&#xff0c;由节点和边组成。每个节点代表一个特征或属性&#xff0c;每个边代表一个判断或决策。从根节点开始&#xff0c;根据特征的不同…

list的使用介绍---C++

一、list简介 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素。…

计算机网络第一章(谢希仁第8版学习)

作者&#xff1a;爱塔居 专栏&#xff1a;计算机网络 作者简介&#xff1a;大三学生&#xff0c;希望和大家一起加油 文章目录 目录 文章目录 一、网络、互连网、互联网&#xff08;因特网&#xff09;的概念 二、因特网的组成 三、交换方式 3.1 电路交换 3.2 分组交换 3.3 电路…

详解c++---list介绍

目录标题 list介绍list定义list遍历list数据插入push_backpush_frontinsert list删除pop_backpop_fronterase list排序list去重list合并list转移list其他函数emptysizefrontbackassignswapresizeclear list排序效率问题 list介绍 list是可以在常数范围内在任意位置进行插入和删…

【Java笔试强训 22】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;小易的升…

【Java笔试强训 21】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525; 洗牌 &…

免费搭建Plex家庭影音中心 - 打造超级多媒体中心【公网远程访问】

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…

java+jsp企业物流货运快递管理系统servlet

功能需求具体描述&#xff1a; (1)用户功能模块包括用户登录注册&#xff0c;用户信息的修改&#xff0c;用户发布货物信息&#xff0c;给客服人员留言&#xff0c;对运输公司进行评价。 (2)企业功能模块包括企业注册登录&#xff0c;企业信息的修改&#xff0c;受理用户发布的…

c#笔记-代码格式

格式 为了让编译器能看懂。我们编写的源码必须符合一定的规范。 区分大小写 c#是大小写敏感语言。A1和a1是不同的东西。 不区分空白字符 c#对空白字符&#xff08;空格&#xff0c;制表符&#xff0c;换行&#xff09;不敏感。只要不截断单词&#xff0c;可以任意地使用空…

Java 基础进阶篇(二)—— 面向对象的三大特征之二:继承

文章目录 一、继承概述二、内存运行原理 ★三、继承的特点四、继承后&#xff1a;成员变量和方法的访问特点五、继承后&#xff1a;方法重写六、继承后&#xff1a;子类构造器的特点七、继承后&#xff1a;子类构造器访问父类有参构造器八、this、super 总结 一、继承概述 Jav…

TiDB实战篇-TiDB集群常用的监控指标

TiDB Server相关指标 Duration(延迟) 总体延迟 SQL不同的类型延迟 不同实例延迟 QPS&#xff08;每秒钟查询次数&#xff09; 总览 CPS&#xff08;一次请求多个sql,上面的QPS每一次就是一个记录&#xff09; 事务相关 延迟 影响性能的大事务 CPU 内存&#xff08;下图…

面试官:谈谈你对死锁的理解

1. 什么是死锁 比如上一次讲到 synchronized 的时候&#xff0c;一个线程&#xff0c;对同一个对象连续加锁两次&#xff0c;如果出现阻塞等待&#xff0c;代表这个锁是不可重入锁&#xff0c;这样的线程&#xff0c;也就称为死锁&#xff01; 一旦程序进入死锁了就会导致线程僵…

PromQL,让你轻松实现监控可视化!快来了解一下吧!

Prometheus 中的一些关键设计&#xff0c;比如注重标准和生态、监控目标动态发现机制、PromQL等。 PromQL 是 Prometheus 的查询语言&#xff0c;使用灵活方便&#xff0c;但很多人不知道如何更好利用它&#xff0c;发挥不出优势。 PromQL主要用于时序数据的查询和二次计算场…