#include "modelInfoEditDialog.h" #include "./ui_modelInfoEditDialog.h" #include "maskLayer.h" #include "mainwindow.h" #include "sqlQueryExecutor.h" #include "textColorPreserveDelegate.h" #include "customBorderContainer.h" #include #include #include #define itemRole_groupID 1 #define itemRole_isPublic 2 ModelInfoEditDialog::ModelInfoEditDialog(QWidget *parent) : QDialog(parent) , ui(new Ui::ModelInfoEditDialog) , m_pMainWindow(nullptr) , m_curModelID(-1) { ui->setupUi(this); if(QSysInfo::kernelType() == "linux") { //Linux下默认的Qt::Dialog即使有父窗口也无法按照子窗口的行为进行展示,并且最大、最小按钮不好关闭,因此需要去掉Dialog属性,随之而来的问题是,模态无法起作用 setWindowFlags(windowFlags() & ~Qt::Dialog); setStyleSheet("QDialog{border: 1px solid rgb(205,205,205);border-radius:5px;background-color:rgb(250,250,250);}"); m_customBorderContainer = new CustomBorderContainer(this); m_customBorderContainer->setOperationOptions(CustomBorderContainer::Movable | CustomBorderContainer::Resizable); } initialize(); } ModelInfoEditDialog::~ModelInfoEditDialog() { delete ui; } void ModelInfoEditDialog::showEvent(QShowEvent* e) { refreshGroupList(); if(m_state == DS_New) { resetUI(); } else //获取指定Model信息 { } } void ModelInfoEditDialog::initialize() { m_state = DS_New; m_curModelID = -1; ui->btnAddGroup->setVisible(false); m_pMaskLayer = new MaskLayer(this); //正则表达式,只能输入字母 QRegularExpression regExp("[A-Za-z0-9_]+"); QRegularExpressionValidator* validator = new QRegularExpressionValidator(regExp, this); ui->lineEdit_modelType->setValidator(validator); TextColorPreserveDelegate* delegate = new TextColorPreserveDelegate(this); ui->sourceList->setItemDelegate(delegate); ui->selectedList->setItemDelegate(delegate); connect(ui->btnSave, &QPushButton::clicked, this, &ModelInfoEditDialog::onBtnClicked_save); connect(ui->btnCancle, &QPushButton::clicked, this, &ModelInfoEditDialog::onBtnClicked_cancle); connect(ui->btnAddGroup, &QPushButton::clicked, this, &ModelInfoEditDialog::onBtnClicked_addGroup); connect(ui->btnRemoveSelected, &QPushButton::clicked, this, &ModelInfoEditDialog::onBtnClicked_removeSelected); connect(ui->sourceList, &QListWidget::itemDoubleClicked, this, &ModelInfoEditDialog::onItemDblCliked_sourceList); } void ModelInfoEditDialog::resetUI() { ui->tabWidget->setCurrentIndex(0); ui->tabWidget->setCurrentIndex(0); ui->lineEdit_modelName->setText(""); ui->lineEdit_modelType->setText(""); ui->plainTextEdit_modelComment->setPlainText(""); ui->label_error->setText(""); } void ModelInfoEditDialog::refreshGroupList() { if(m_pMainWindow) { ui->sourceList->clear(); ui->selectedList->clear(); QString connection = m_pMainWindow->getCurConnection(); const QVector groups = SqlQueryExecutor::instance().getAttributeGroup(connection); for(const AttributeGroup& group : groups) { QListWidgetItem* sourceItem = new QListWidgetItem(group.name); sourceItem->setFlags(sourceItem->flags() & ~Qt::ItemIsEditable); sourceItem->setData(Qt::UserRole + itemRole_groupID, group.id); sourceItem->setData(Qt::UserRole + itemRole_isPublic, group.isPublic); ui->sourceList->addItem(sourceItem); if(group.isPublic) { QListWidgetItem* selectedItem = new QListWidgetItem(*sourceItem); //selectedItem->setIcon(QIcon(":/img/images/icon_no.png")); selectedItem->setForeground(QBrush(QColor(128,128,128))); ui->selectedList->addItem(selectedItem); } } } } void ModelInfoEditDialog::setErrorInfo(const QString& info) { if(m_pMainWindow) m_pMainWindow->showMessageDialog(type_warning, QString::fromWCharArray(L"错误"),info); else ui->label_error->setText(info); } void ModelInfoEditDialog::setMainWindow(MainWindow* window) { m_pMainWindow = window; } void ModelInfoEditDialog::setModel(int id) { m_curModelID = id; } void ModelInfoEditDialog::showMask() { m_pMaskLayer->setGeometry(0, 0, this->width(), this->height()); m_pMaskLayer->show(); } void ModelInfoEditDialog::hideMask() { m_pMaskLayer->close(); } void ModelInfoEditDialog::onItemDblCliked_sourceList(QListWidgetItem* item) { if(item->data(Qt::UserRole + itemRole_isPublic).toBool()) return; QList foundItems = ui->selectedList->findItems(item->text(), Qt::MatchFixedString); if(foundItems.isEmpty()) { QListWidgetItem* selectedItem = new QListWidgetItem(*item); ui->selectedList->addItem(selectedItem); } } void ModelInfoEditDialog::onBtnClicked_save() { if(ui->lineEdit_modelName->text() == "" || ui->lineEdit_modelType->text() == "") { setErrorInfo(QString::fromWCharArray(L"除‘备注’外不能有信息为空")); return; } QString modelName = ui->lineEdit_modelName->text(); QString modeType = ui->lineEdit_modelType->text(); QString remark = ui->plainTextEdit_modelComment->toPlainText(); QVector groups; for(int i = 0; i < ui->selectedList->count(); i++) { QListWidgetItem* item = ui->selectedList->item(i); groups.append(item->data(Qt::UserRole + itemRole_groupID).toInt()); } if(!m_pMainWindow) { setErrorInfo(QString::fromWCharArray(L"无法获取当前数据库链接")); resetUI(); return; } //先判断是否存在同名 QString connection = m_pMainWindow->getCurConnection(); bool nameExists = SqlQueryExecutor::instance().modelNameExistsInDB(connection, modelName); if(nameExists) { setErrorInfo(QString::fromWCharArray(L"已存同名的模型,请修改模型名称")); ui->tabWidget->setCurrentIndex(0); return; } else //然后判断类型是否存在相同 { bool typeExists = SqlQueryExecutor::instance().modelTypeExistsInDB(connection, modeType); if(typeExists) { setErrorInfo(QString::fromWCharArray(L"已存同类型的模型,请修改模型类型")); ui->tabWidget->setCurrentIndex(0); return; } } //向数据库中插入数据(因为提供了连续添加的功能,所以向数据库中插入数据放在这里执行) Model modle(-1, modelName, modeType, remark, groups); bool result = SqlQueryExecutor::instance().addModel(connection, modle); if(result) { emit addModel(modle); m_pMainWindow->showMessageDialog(type_question, QString::fromWCharArray(L"成功"),QString::fromWCharArray(L"信息存储完成,是否继续添加模型")); if(g_msgDlgBtn == btn_No) close(); else { resetUI(); refreshGroupList(); } } else setErrorInfo(QString::fromWCharArray(L"信息存储失败,详情可见日志文件")); } void ModelInfoEditDialog::onBtnClicked_cancle() { close(); } void ModelInfoEditDialog::onBtnClicked_addGroup() { setErrorInfo(QString::fromWCharArray(L"该功能暂未开放")); } void ModelInfoEditDialog::onBtnClicked_removeSelected() { QListWidgetItem* item = ui->selectedList->currentItem(); if(item && item->data(Qt::UserRole + itemRole_isPublic).toBool()) { setErrorInfo(QString::fromWCharArray(L"该组别为必选组别,不可移除")); return; } int row = ui->selectedList->currentRow(); item = ui->selectedList->takeItem(row); if(item) delete item; }