2024-11-25 17:15:44 +08:00

410 lines
14 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "usermanager.h"
#include "ui_usermanager.h"
#include "cdatabaseinterface.h"
#include "dbforrmate.h"
#include <QDebug>
#include <QCheckBox>
#include <QMessageBox>
#include "currentuserdata.h"
#include "selectuserdialog.h"
#include "deleteuserdialog.h"
#include <QTimer>
#include "languagemanager.h"
#include "dataformate.h"
UserManager::UserManager(QWidget *parent) :
QWidget(parent),
ui(new Ui::UserManager),
m_userDialog(nullptr),
m_completer(nullptr),
m_slectUserDialog(nullptr),
m_deleteUserDialog(nullptr)
{
ui->setupUi(this);
m_userDialog = new UserDialog();
connect(m_userDialog,&UserDialog::signalUpdateUserTable,this,&UserManager::slotUpdateUserTable);
initUserTableWidget();
updateUserTableWidget();
QTimer::singleShot(500,this,SLOT(setDefaultUser()));
// setDefaultUser();
connect(this,SIGNAL(signalCheckUserChanged(int)),ui->trainRecord_Widget,SLOT(slotCheckUserChanged(int)));
//设置搜索框自动补全
m_completer = new QCompleter();
m_completer->setFilterMode(Qt::MatchStartsWith);
m_completer->setCompletionMode(QCompleter::PopupCompletion);
m_completer->setMaxVisibleItems(7);
m_completer->setModel(&stringListModel);
ui->searchUser_LineEdit->setCompleter(m_completer);
ui->searchUser_LineEdit->setPlaceholderText(tr("姓名或者ID"));
connect(ui->searchUser_LineEdit,SIGNAL(editingFinished()),this,SLOT(editComplete()));
connect(ui->searchUser_LineEdit,&QLineEdit::textChanged,[this](const QString text){
if(text == "")
{
updateUserTableWidget();
}
});
// connect(ui->searchUser_LineEdit,&QLineEdit::textEdited,[this](const QString text){
// qDebug()<<"textEdited"<<text;
// });
m_slectUserDialog = new SelectUserDialog();
m_deleteUserDialog = new DeleteUserDialog();
}
void UserManager::editComplete()
{
//此处可用来自动添加被检索时没有的内容,可以将lineEdit中的内容添加到model中但是在咱们这种情况下不适用
//目前的需求是将数据库中有的数据显示出来,没有的不需要补全
}
UserManager::~UserManager()
{
if(m_userDialog)
delete m_userDialog;
if(m_completer)
delete m_completer;
if(m_slectUserDialog)
delete m_slectUserDialog;
if(m_deleteUserDialog)
delete m_deleteUserDialog;
delete ui;
}
void UserManager::initUserTableWidget()
{
ui->user_TableWidget->horizontalHeader()->setVisible(false);
ui->user_TableWidget->verticalHeader()->setVisible(false);
ui->user_TableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->user_TableWidget->setAlternatingRowColors(true);
ui->user_TableWidget->setPalette(QPalette(Qt::lightGray));
ui->user_TableWidget->setColumnCount(3);
ui->user_TableWidget->setRowCount(20);
// ui->user_TableWidget->setGridStyle(Qt::NoPen);
ui->user_TableWidget->setShowGrid(false);
ui->user_TableWidget->setColumnWidth(0,140);
ui->user_TableWidget->setColumnWidth(1,90);
ui->user_TableWidget->setColumnWidth(2,240);
ui->user_TableWidget->setFont(QFont("黑体",15));
for(int i = 0;i < 20;i++)
ui->user_TableWidget->setRowHeight(i,68);
//设置单行选中
ui->user_TableWidget->setSelectionBehavior(QTableWidget::SelectRows);
ui->user_TableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
//设置表格所有单元格不可编辑
ui->user_TableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
connect(ui->user_TableWidget,&QTableWidget::cellClicked,[this](int row,int column){
Q_UNUSED(column)
//根据行列获取用户ID
qDebug() <<"row colume m_currentRows"<<row<<column<<m_currentRows;
if(row >= m_currentRows )
{
return;
}
//qDebug()<<"选择了ID"<<ui->user_TableWidget->item(row,2)->data(Qt::DisplayRole).toUInt();
m_currentUserId = ui->user_TableWidget->item(row,2)->data(Qt::DisplayRole).toUInt();
emit signalCheckUserChanged(m_currentUserId);
});
//UI显示问题待解决
// ui->user_TableWidget->setFocusPolicy(Qt::NoFocus);
ui->user_TableWidget->setStyleSheet("QTableWidget::item{outline:none;}"
);
}
void UserManager::updateUserTableWidget()
{
QString queryStr(QString("select * from PatientTable order by ID DESC"));
if(CDatabaseInterface::getInstance()->exec(queryStr))
{
int tempNum = CDatabaseInterface::getInstance()->getValuesSize();
int fillTableNum = tempNum < 20 ? tempNum : 20;
m_currentRows = fillTableNum;
if(fillTableNum > 0)
{
QList<QVariantMap> valueMapList;
valueMapList = CDatabaseInterface::getInstance()->getValues(0,fillTableNum);
fillUserTable(valueMapList);
}
else
{
ui->user_TableWidget->clearContents();
qDebug()<<"updateUserTableWidget()未查询到符合条件的数据";
}
}
else
qDebug()<<CDatabaseInterface::getInstance()->getLastError();
}
void UserManager::fillUserTable(const QList<QVariantMap> &ListMap)
{
ui->user_TableWidget->clearContents();
wordList.clear();
for(int row = 0;row < ListMap.size();++row)
{
ST_PatientMsg st_PatientMsg = variantMapToPatientMsg(ListMap.at(row));
//更新自动补全表
wordList.append(st_PatientMsg.name);
wordList.append(QString::number(st_PatientMsg.ID));
stringListModel.setStringList(wordList);
//第0列
/***
QTableWidgetItem *checkItem = new QTableWidgetItem();
ui->user_TableWidget->setItem(row,0,checkItem);
QCheckBox *checkBox = new QCheckBox();
checkBox->setFixedWidth(40);
checkBox->setLayoutDirection(Qt::RightToLeft);
//使用该方法时必须先添加QTableWidgetItem
ui->user_TableWidget->setCellWidget(row,0,checkBox);
*****/
//第0列 名字
QTableWidgetItem *nameItem = new QTableWidgetItem(st_PatientMsg.name);
// nameItem->setFlags(nameItem->flags() & (~Qt::ItemIsEditable)); //设置单个单元格不可编辑
ui->user_TableWidget->setItem(row, 0, nameItem);
//第1列 性别
QString sexStr;
E_LANGUAGE language = LanguageManager::getInstance()->getCurrentLanguage();
qDebug() << "language"<<language;
if(0 == st_PatientMsg.sex)
{
if(language == English_E)
sexStr = tr("Male");
else if(language == Chinese_E)
sexStr = tr("");
}
else if(1 == st_PatientMsg.sex)
{
if(language == English_E)
sexStr = tr("Female");
else if(language == Chinese_E)
sexStr = tr("");
}
QTableWidgetItem *sexItem = new QTableWidgetItem(sexStr);
// nameItem->setFlags(nameItem->flags() & (~Qt::ItemIsEditable)); //设置单个单元格不可编辑
ui->user_TableWidget->setItem(row, 1, sexItem);
//第2列 ID
QTableWidgetItem *IdItem = new QTableWidgetItem(QString::number(st_PatientMsg.ID));
ui->user_TableWidget->setItem(row, 2, IdItem);
// ui->user_TableWidget->cellWidget(row,0)->setGeometry(10,20,10,20);
ui->user_TableWidget->item(row,0)->setTextAlignment(Qt::AlignCenter);
ui->user_TableWidget->item(row,1)->setTextAlignment(Qt::AlignCenter);
ui->user_TableWidget->item(row,2)->setTextAlignment(Qt::AlignCenter);
}
}
void UserManager::setDefaultUser()
{
/***
QString queryStr(QString("select * from PatientTable where ID = '%1'").arg(wordList.last().toInt()));
if(CDatabaseInterface::getInstance()->exec(queryStr))
{
if(CDatabaseInterface::getInstance()->getValuesSize() > 0)
{
QVariantMap userMap = CDatabaseInterface::getInstance()->getValues(0,1).at(0);
ST_PatientMsg st_patientMsg = variantMapToPatientMsg(userMap);
//设置当前用户
CurrentUserData::getInstace()->setCurrentUserMsg(st_patientMsg);
}
else
QMessageBox::warning(NULL,tr("提示"),tr("未查到默认用户信息"));
}
***/
ST_PatientMsg st_patientMsg;
st_patientMsg.ID = 100000;
st_patientMsg.name = "xyyl";
CurrentUserData::getInstace()->setCurrentUserMsg(st_patientMsg);
}
void UserManager::on_searchUser_Btn_clicked()
{
//首先清理界面
ui->user_TableWidget->clearContents();
//检索的情况下不显示添加按钮,只显示符合检索条件的内容
QString msg = ui->searchUser_LineEdit->text();
QString query(QString("select * from PatientTable where name like '%1%' or id like '%2%'").arg(msg).arg(msg));
QList<QVariantMap> valueMapList;
valueMapList.clear();
qDebug() <<"最开始用户数:"<<valueMapList.count();
if(CDatabaseInterface::getInstance()->exec(query))
{
valueMapList = CDatabaseInterface::getInstance()->getValues(0,8);
qDebug()<<"name:"<<variantMapToPatientMsg(valueMapList.at(0)).ID;
}
if(variantMapToPatientMsg(valueMapList.at(0)).ID == 0) //如果有查到为0的ID直接清空
valueMapList.clear();
m_currentRows = valueMapList.count(); //此时要更新能选择的行,防止崩溃
qDebug() <<"查询后用户数:"<<valueMapList.count();
if(0 == valueMapList.count())//id = 0,sex=男,name=""
{
qDebug()<<"未找到合适数据";
return;
}
qDebug() <<"查询后的用户数:"<<valueMapList.count();
fillUserTable(valueMapList);
}
void UserManager::slotUpdateUserTable()
{
updateUserTableWidget();
}
void UserManager::on_newUser_Btn_clicked()
{
m_userDialog->setDialogTitle(E_NEW_USER);
}
//选择用户
void UserManager::on_selectUser_Btn_clicked()
{
QString queryStr(QString("select * from PatientTable where ID = '%1'").arg(m_currentUserId));
if(CDatabaseInterface::getInstance()->exec(queryStr))
{
if(CDatabaseInterface::getInstance()->getValuesSize() > 0)
{
QVariantMap userMap = CDatabaseInterface::getInstance()->getValues(0,1).at(0);
ST_PatientMsg st_patientMsg = variantMapToPatientMsg(userMap);
m_slectUserDialog->setUserMsg(st_patientMsg);
m_slectUserDialog->show();
m_slectUserDialog->exec();
//设置当前用户
if(m_slectUserDialog->isSelectUser())
CurrentUserData::getInstace()->setCurrentUserMsg(st_patientMsg);
}
else
QMessageBox::warning(NULL,tr("提示"),tr("未查到该用户信息"));
}
}
void UserManager::on_EditUser_Btn_clicked()
{
QString queryStr(QString("select * from PatientTable where ID = '%1'").arg(m_currentUserId));
if(CDatabaseInterface::getInstance()->exec(queryStr))
{
if(CDatabaseInterface::getInstance()->getValuesSize() > 0)
{
QVariantMap userMap = CDatabaseInterface::getInstance()->getValues(0,1).at(0);
//ST_PatientMsg st_patientMsg = variantMapToPatientMsg(userMap);
//m_slectUserDialog->setUserMsg(st_patientMsg);
//m_slectUserDialog->show();
//m_slectUserDialog->exec();
//设置当前用户
/*
if(m_slectUserDialog->isSelectUser())
CurrentUserData::getInstace()->setCurrentUserMsg(st_patientMsg);
*/
m_userDialog->setDialogTitle(E_EDIT_USER,m_currentUserId);
}
else
QMessageBox::warning(NULL,tr("提示"),tr("未查到该用户信息"));
}
}
void UserManager::on_deleteUser_Btn_clicked()
{
QString queryStr(QString("select * from PatientTable where ID = '%1'").arg(m_currentUserId));
if(CDatabaseInterface::getInstance()->exec(queryStr))
{
if(CDatabaseInterface::getInstance()->getValuesSize() > 0)
{
QVariantMap userMap = CDatabaseInterface::getInstance()->getValues(0,1).at(0);
//ST_PatientMsg st_patientMsg = variantMapToPatientMsg(userMap);
//m_slectUserDialog->setUserMsg(st_patientMsg);
//m_slectUserDialog->show();
//m_slectUserDialog->exec();
//设置当前用户
/*
if(m_slectUserDialog->isSelectUser())
CurrentUserData::getInstace()->setCurrentUserMsg(st_patientMsg);
*/
//m_userDialog->setDialogTitle(E_EDIT_USER,m_currentUserId);
m_deleteUserDialog->show();
m_deleteUserDialog->exec();
if(m_deleteUserDialog->isDeletedUser())
{
if(!CDatabaseInterface::getInstance()->deleteRowTable("PatientTable","ID",QString::number(m_currentUserId)))
qDebug()<<"delete user failed"<<CDatabaseInterface::getInstance()->getLastError();
updateUserTableWidget();
}
else
return;
}
else
QMessageBox::warning(NULL,tr("提示"),tr("未查到该用户信息"));
}
/**********之前的删除方式,可以同时删除多个用户**********
QList<int> deleteIndexList;
int deleteUserNum = 0;
for(int i = 0;i <m_currentRows;++i)
{
QCheckBox *checkBox = static_cast<QCheckBox*>(ui->user_TableWidget->cellWidget(i,0));
if(checkBox->isChecked())
{
QString ID = ui->user_TableWidget->item(i,2)->data(Qt::DisplayRole).toString();
if(!CDatabaseInterface::getInstance()->deleteRowTable("PatientTable","ID",ID))
qDebug()<<"delete user failed"<<CDatabaseInterface::getInstance()->getLastError();
else
++deleteUserNum;
}
}
if(deleteUserNum > 0)
QMessageBox::information(NULL,tr("提示"),tr("删除成功"));
***************/
}
void UserManager::changeEvent(QEvent* event)
{
switch (event->type())
{
case QEvent::LanguageChange:
updateUserTableWidget(); //刷新表
ui->retranslateUi(this);
break;
default:
QWidget::changeEvent(event);
break;
}
}
void UserManager::showEvent(QShowEvent *event)
{
Q_UNUSED(event)
ui->searchUser_LineEdit->clear();
//ui->trainRecordDestPage_LineEdit->clear(); //清空查询
}