def edit_CQR_table(self, pos):
# 检查 pos 是否有效
if not isinstance(pos, QtCore.QPoint):
return
menu = QMenu(self)
action_add_now_disease_Window = QAction("添加", self)
action_delete_now_disease = QAction("删除", self)
action_revise_now_disease = QAction("修改", self)
menu.addAction(action_add_now_disease_Window)
menu.addAction(action_delete_now_disease)
menu.addAction(action_revise_now_disease)
action_add_now_disease_Window.triggered.connect(self.add_now_disease)
action_delete_now_disease.triggered.connect(self.delete_now_disease)
action_revise_now_disease.triggered.connect(self.revise_now_diseas)
menu.exec_(self.ui.tableWidget__CQR_now_disease.viewport().mapToGlobal(pos))
def add_now_disease(self):
if hasattr(self, 'now_disease_Window') and self.now_disease_Window.isVisible():
return
self.now_disease_Window = now_disease_Window(mode='add', parent=self)
self.now_disease_Window.operation_completed.connect(self.load_data) # 连接操作完成信号
self.now_disease_Window.show()
def revise_now_diseas(self):
selected_rows = self.ui.tableWidget__CQR_now_disease.selectionModel().selectedRows()
if not selected_rows: #selectionModel().selectedRows() 可以更准确、安全地获取用户当前选中的 整行 数据,而不是仅仅依赖于某些单元格的内容。
QMessageBox.warning(self, "警告", "请先选择一行记录")
return
row_idx = selected_rows[0].row()
symptom_name = self.ui.tableWidget__CQR_now_disease.item(row_idx, 0).text()
if self.edit_window:
self.edit_window.close()
self.now_disease_Window = now_disease_Window(
mode='edit',
symptom_name=symptom_name,
parent=self
)
self.now_disease_Window.operation_completed.connect(self.CQR_now_disease) # 连接操作完成信号
self.now_disease_Window.show()
def delete_now_disease(self):
selected_rows = self.ui.tableWidget__CQR_now_disease.selectionModel().selectedRows()
if not selected_rows:
QMessageBox.warning(self, "警告", "请先选择一行记录")
return
row_idx = selected_rows[0].row()
symptom_name = self.ui.tableWidget__CQR_now_disease.item(row_idx, 0).text()
reply = QMessageBox.question(
self, '确认删除',
f"确定要删除症状 '{symptom_name}' 吗?",
QMessageBox.Yes | QMessageBox.No
)
if reply == QMessageBox.Yes:
try:
with POOL.connection() as conn:
with conn.cursor() as cursor:
cursor.execute("DELETE FROM `现病史` WHERE 症状 = %s", (symptom_name,))
conn.commit()
self.CQR_now_disease() # 刷新表格
QMessageBox.information(self, "成功", "症状已成功删除")
except Exception as e:
conn.rollback()
QMessageBox.critical(self, "数据库错误", f"删除失败: {str(e)}")
class now_disease_Window(QMainWindow):
operation_completed = pyqtSignal()
def __init__(self, mode=None, symptom_name=None, parent=None):
super().__init__(parent)
self.ui = Ui_now_disease_Window()
self.ui.setupUi(self)
self.mode = mode # 'add' 或 'edit'
self.symptom_name = symptom_name
# 检查数据库连接
if not self.check_db_connection():
QMessageBox.critical(self, "数据库错误", "无法连接数据库")
QTimer.singleShot(100, self.close)
return
if self.mode == 'add':
self.ui.pushButton.setText("添加")
self.ui.pushButton.clicked.connect(self.submit_data)
elif self.mode == 'edit':
self.ui.pushButton.setText("更新")
self.ui.pushButton.clicked.connect(self.update_disease)
# 延迟加载数据
QTimer.singleShot(100, self.show_disease)
self.show()
def check_db_connection(self):
"""检查数据库连接是否可用"""
try:
with POOL.connection() as conn:
with conn.cursor() as cursor:
cursor.execute("SELECT 1")
return True
except Exception as e:
print(f"数据库连接失败: {str(e)}")
return False
def submit_data(self):
"""提交数据到数据库"""
disease = self.ui.lineEdit.text()
detail = self.ui.textEdit.toPlainText()
pinyin_list = lazy_pinyin(disease, style=Style.FIRST_LETTER)
pinyin_text = ''.join(pinyin_list)
# 设置文本框显示值
self.ui.lineEdit_2.setText(pinyin_text)
# 简单的验证
if not disease:
QMessageBox.warning(self, "输入错误", "请输入要添加的内容!")
return
if not detail:
QMessageBox.warning(self, "输入错误", "请输入问诊要点!")
return
try:
with POOL.connection() as conn:
with conn.cursor() as cursor:
# 添加新记录
sql = "INSERT INTO `现病史` (症状,问诊要点,首拼) VALUES (%s, %s, %s)"
cursor.execute(sql, (disease,detail, pinyin_text))
conn.commit()
if cursor.rowcount > 0:
QMessageBox.information(self, "成功", "数据添加成功!")
self.operation_completed.emit()
else:
QMessageBox.warning(self, "失败", "数据添加失败,请重试。")
except Exception as e:
conn.rollback()
QMessageBox.critical(self, "数据库错误", f"操作失败: {str(e)}")
def show_disease(self):
try:
with POOL.connection() as conn:
with conn.cursor() as cursor:
sql = """SELECT 症状,问诊要点,首拼 FROM `现病史` WHERE `症状` = %s"""
cursor.execute(sql, (self.symptom_name,))
symptom_data = cursor.fetchone() # 返回字典
if symptom_data:
# 使用字段名访问数据
self.ui.lineEdit.setText(symptom_data['症状'])
self.ui.lineEdit_2.setText(symptom_data['首拼'])
self.ui.textEdit.setPlainText(symptom_data['问诊要点'])
else:
QMessageBox.warning(self, "失败", "症状查询失败。")
except Exception as e:
conn.rollback()
QMessageBox.critical(self, "数据库错误", f"操作失败: {str(e)}")
def update_disease(self):
disease = self.ui.lineEdit.text()
detail = self.ui.textEdit.toPlainText()
shoupin = self.ui.lineEdit_2.text()
try:
with POOL.connection() as conn:
with conn.cursor() as cursor:
sql = """
UPDATE `现病史`
SET `症状` = %s, `首拼` = %s, `问诊要点` = %s,
WHERE `症状` = %s
"""
cursor.execute(sql, (disease, shoupin, detail, self.symptom_name))
conn.commit()
if cursor.rowcount > 0:
QMessageBox.information(self, "成功", "数据更新成功!")
self.operation_completed.emit()
else:
QMessageBox.warning(self, "失败", "数据更新失败,请重试。")
except Exception as e:
conn.rollback()
QMessageBox.critical(self, "数据库错误", f"操作失败: {str(e)}")
还是打开后空白并且卡退