DiagramDesigner/diagramCavas/source/structDataMeasurementDelega...

428 lines
15 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 <QLineEdit>
#include <QComboBox>
#include <QSpinBox>
#include <QCheckBox>
#include <QCompleter>
#include <QKeyEvent>
#include "structDataMeasurementDelegate.h"
#include "structDataMeasurementModel.h"
#include "structDataCauseEditDlg.h"
#include "structDataActionParaDlg.h"
#include "uiCommunicationBus.h"
StructDataMeasurementDelegate::StructDataMeasurementDelegate(QObject* parent) : QStyledItemDelegate(parent) {}
QWidget* StructDataMeasurementDelegate::createEditor(QWidget* parent,
const QStyleOptionViewItem& option,
const QModelIndex& index) const {
Q_UNUSED(option);
int column = index.column();
switch (column) {
case StructDataMeasurementModel::ColConnectPara:
return createConnectParaEditor(parent);
case StructDataMeasurementModel::ColType:
return createMeasurementTypeEditor(parent);
case StructDataMeasurementModel::ColSize:
return createSizeEditor(parent);
case StructDataMeasurementModel::ColSource:
return createSourceEditor(parent);
case StructDataMeasurementModel::ColStation:
return createTextEditor(parent);
case StructDataMeasurementModel::ColEquipment:
return createTextEditor(parent);
case StructDataMeasurementModel::ColChannel:
return createTextEditor(parent);
case StructDataMeasurementModel::ColPacket:
return createNumberEditor(parent);
case StructDataMeasurementModel::ColOffset:
return createNumberEditor(parent);
case StructDataMeasurementModel::ColEnable:
return createEnableEditor(parent);
case StructDataMeasurementModel::ColCause:{
QString sType = getParaType(index);
if(sType == "遥测"){ //遥测
return createCauseYCEditor(parent,index);
}
else if(sType == "遥信") { //遥信
return createCauseYXEditor(parent);
}
}
case StructDataMeasurementModel::ColCommand:
return createCommandEditor(parent);
case StructDataMeasurementModel::ColParameters:
return createActionParaEditor(parent);
}
return nullptr;
}
void StructDataMeasurementDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const {
int column = index.column();
QVariant value = index.data(Qt::EditRole);
switch (column) {
case StructDataMeasurementModel::ColConnectPara:
if (QLineEdit* lineEdit = qobject_cast<QLineEdit*>(editor)) {
lineEdit->setText(value.toString());
}
break;
case StructDataMeasurementModel::ColType:
if (QComboBox* comboBox = qobject_cast<QComboBox*>(editor)) {
int typeValue = value.toInt();
comboBox->setCurrentIndex(qBound(0, typeValue, 2));
}
break;
case StructDataMeasurementModel::ColSize:
if (QSpinBox* spinBox = qobject_cast<QSpinBox*>(editor)) {
spinBox->setValue(value.toInt());
}
break;
case StructDataMeasurementModel::ColSource:
if (QComboBox* comboBox = qobject_cast<QComboBox*>(editor)) {
int sourceValue = value.toInt();
int index = (sourceValue == 1) ? 0 : 1; // 1: cl3611, 2: 104
comboBox->setCurrentIndex(index);
}
break;
case StructDataMeasurementModel::ColStation:
if (QLineEdit* lineEdit = qobject_cast<QLineEdit*>(editor)) {
lineEdit->setText(value.toString());
}
break;
case StructDataMeasurementModel::ColEquipment:
if (QLineEdit* lineEdit = qobject_cast<QLineEdit*>(editor)) {
lineEdit->setText(value.toString());
}
break;
case StructDataMeasurementModel::ColChannel:
if (QLineEdit* lineEdit = qobject_cast<QLineEdit*>(editor)) {
lineEdit->setText(value.toString());
}
break;
case StructDataMeasurementModel::ColPacket:
if (QSpinBox* spinBox = qobject_cast<QSpinBox*>(editor)) {
spinBox->setValue(value.toInt());
}
break;
case StructDataMeasurementModel::ColOffset:
if (QSpinBox* spinBox = qobject_cast<QSpinBox*>(editor)) {
spinBox->setValue(value.toInt());
}
break;
case StructDataMeasurementModel::ColEnable:
if (QComboBox* comboBox = qobject_cast<QComboBox*>(editor)) {
bool res = value.toBool();
int index = (res) ? 0 : 1; // 0: 启用, 1: 禁用
comboBox->setCurrentIndex(index);
}
break;
case StructDataMeasurementModel::ColCause:{
QString sType = getParaType(index);
if(sType == "遥测"){
if (StructDataCauseEditDlg* dialog = qobject_cast<StructDataCauseEditDlg*>(editor)) {
QMap<QString, double> data = value.value<QMap<QString, double>>();
dialog->setData(data);
}
}
else if(sType == "遥信"){
if (QComboBox* comboBox = qobject_cast<QComboBox*>(editor)) {
comboBox->setCurrentText(value.toString());
}
}
}
break;
case StructDataMeasurementModel::ColCommand:
if (QComboBox* comboBox = qobject_cast<QComboBox*>(editor)) {
comboBox->setCurrentText(value.toString());
}
break;
case StructDataMeasurementModel::ColParameters:
if (StructDataActionParaDlg* dialog = qobject_cast<StructDataActionParaDlg*>(editor)) {
QStringList lst = value.toStringList();
dialog->setAlarms(lst);
}
break;
}
}
void StructDataMeasurementDelegate::setModelData(QWidget* editor, QAbstractItemModel* model,
const QModelIndex& index) const {
int column = index.column();
QVariant newValue;
switch (column) {
case StructDataMeasurementModel::ColConnectPara:
if (QLineEdit* lineEdit = qobject_cast<QLineEdit*>(editor)) {
newValue = lineEdit->text().trimmed();
}
break;
case StructDataMeasurementModel::ColEquipment:
if (QLineEdit* lineEdit = qobject_cast<QLineEdit*>(editor)) {
newValue = lineEdit->text().trimmed();
}
break;
case StructDataMeasurementModel::ColChannel:
if (QLineEdit* lineEdit = qobject_cast<QLineEdit*>(editor)) {
newValue = lineEdit->text().trimmed();
}
break;
case StructDataMeasurementModel::ColStation:
if (QLineEdit* lineEdit = qobject_cast<QLineEdit*>(editor)) {
newValue = lineEdit->text().trimmed();
}
break;
case StructDataMeasurementModel::ColType:
if (QComboBox* comboBox = qobject_cast<QComboBox*>(editor)) {
newValue = comboBox->currentIndex(); // 0:遥测, 1:遥信, 2:遥控
}
break;
case StructDataMeasurementModel::ColSize:
if (QSpinBox* spinBox = qobject_cast<QSpinBox*>(editor)) {
newValue = spinBox->value();
}
break;
case StructDataMeasurementModel::ColPacket:
if (QSpinBox* spinBox = qobject_cast<QSpinBox*>(editor)) {
newValue = spinBox->value();
}
break;
case StructDataMeasurementModel::ColOffset:
if (QSpinBox* spinBox = qobject_cast<QSpinBox*>(editor)) {
newValue = spinBox->value();
}
break;
case StructDataMeasurementModel::ColSource:
if (QComboBox* comboBox = qobject_cast<QComboBox*>(editor)) {
// 转换文本为数值cl3611 -> 1, 104 -> 21
QString text = comboBox->currentText();
newValue = (text == "cl3611") ? 1 : 2;
}
break;
case StructDataMeasurementModel::ColEnable:
if (QComboBox* comboBox = qobject_cast<QComboBox*>(editor)) {
// 转换文本为数值:启用 -> 1, 禁用-> 0
QString text = comboBox->currentText();
newValue = (text == "启用") ? true : false;
}
break;
case StructDataMeasurementModel::ColCause:{
QString sType = getParaType(index);
if(sType == "遥测"){
if (StructDataCauseEditDlg* dialog = qobject_cast<StructDataCauseEditDlg*>(editor)) {
if (dialog->result() == QDialog::Accepted) {
newValue = QVariant::fromValue(dialog->getData());
}
}
}
else if(sType == "遥信"){
if (QComboBox* comboBox = qobject_cast<QComboBox*>(editor)) {
newValue = comboBox->currentText();
}
}
break;
}
case StructDataMeasurementModel::ColCommand:
if (QComboBox* comboBox = qobject_cast<QComboBox*>(editor)) {
newValue = comboBox->currentText();
}
break;
case StructDataMeasurementModel::ColParameters:
if (StructDataActionParaDlg* dialog = qobject_cast<StructDataActionParaDlg*>(editor)) {
newValue = dialog->alarms();
}
break;
}
if (!newValue.isNull()) {
model->setData(index, newValue, Qt::EditRole);
}
}
void StructDataMeasurementDelegate::updateEditorGeometry(QWidget* editor,
const QStyleOptionViewItem& option,
const QModelIndex& index) const
{
Q_UNUSED(index);
editor->setGeometry(option.rect);
}
QString StructDataMeasurementDelegate::displayText(const QVariant& value, const QLocale& locale) const {
Q_UNUSED(locale);
// 特殊列显示格式化
if (value.userType() == QMetaType::Bool) {
return value.toBool() ? "启用" : "禁用";
}
return QStyledItemDelegate::displayText(value, locale);
}
// 提供工具提示
QString StructDataMeasurementDelegate::displayText(const QVariant& value, const QLocale& locale,
const QModelIndex& index) const {
int column = index.column();
if (column == StructDataMeasurementModel::ColType) {
int type = value.toInt();
switch (type) {
case 0: return "遥测";
case 1: return "遥信";
case 2: return "遥控";
default: return QString::number(type);
}
} else if (column == StructDataMeasurementModel::ColSource) {
int source = value.toInt();
switch (source) {
case 1: return "cl3611";
case 2: return "104";
default: return QString::number(source);
}
} else if (column == StructDataMeasurementModel::ColEnable) {
bool enabled = value.toBool();
return enabled ? "启用" : "禁用";
}
return displayText(value, locale);
}
void StructDataMeasurementDelegate::onConnectParamChanged(const QString& str) const
{
QVariantMap map;
map.insert("input",str);
UiCommunicationBus::instance()->sendHttpRequest("/measurement/recommend",QVariant(),"GET",map);
}
bool StructDataMeasurementDelegate::eventFilter(QObject *obj, QEvent *event)
{
if (QLineEdit *editor = qobject_cast<QLineEdit*>(obj)){
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
if (keyEvent->key() == Qt::Key_Space) {
qDebug() << "eventFilter:space";
onConnectParamChanged(editor->text());
_connectCompleter->complete();
return true;
}
if (keyEvent->text() == ".") {
qDebug() << "eventFilter:dot";
// 返回false让事件继续传播
}
}
}
return QStyledItemDelegate::eventFilter(obj, event);
}
QWidget* StructDataMeasurementDelegate::createConnectParaEditor(QWidget* parent) const {
QLineEdit* lineEdit = new QLineEdit(parent);
lineEdit->setMaxLength(150);
lineEdit->installEventFilter(const_cast<StructDataMeasurementDelegate*>(this));
lineEdit->setPlaceholderText("空格获取初始值");
lineEdit->setCompleter(_connectCompleter);
connect(lineEdit, &QLineEdit::textChanged, this, [=](const QString &text) {
if (text.endsWith(".")) {
onConnectParamChanged(text);
}
});
return lineEdit;
}
QWidget* StructDataMeasurementDelegate::createTextEditor(QWidget* parent) const {
QLineEdit* lineEdit = new QLineEdit(parent);
lineEdit->setMaxLength(100);
return lineEdit;
}
QWidget* StructDataMeasurementDelegate::createMeasurementTypeEditor(QWidget* parent) const {
QComboBox* comboBox = new QComboBox(parent);
comboBox->addItems({"遥测", "遥信", "遥控"});
return comboBox;
}
QWidget* StructDataMeasurementDelegate::createSizeEditor(QWidget* parent) const {
QSpinBox* spinBox = new QSpinBox(parent);
spinBox->setRange(1, 1000);
return spinBox;
}
QWidget* StructDataMeasurementDelegate::createSourceEditor(QWidget* parent) const {
QComboBox* comboBox = new QComboBox(parent);
comboBox->addItems({"cl3611", "104"});
return comboBox;
}
QWidget* StructDataMeasurementDelegate::createNumberEditor(QWidget* parent) const {
QSpinBox* spinBox = new QSpinBox(parent);
spinBox->setRange(0, 9999);
return spinBox;
}
QWidget* StructDataMeasurementDelegate::createEnableEditor(QWidget* parent) const {
QComboBox* comboBox = new QComboBox(parent);
comboBox->addItems({"启用", "禁用"});
return comboBox;
}
QWidget* StructDataMeasurementDelegate::createCauseYCEditor(QWidget* parent, const QModelIndex& index) const {
QVariant value = index.data(Qt::EditRole);
QMap<QString, double> initialData;
if (value.canConvert<QMap<QString, double>>()) {
initialData = value.value<QMap<QString, double>>();
}
StructDataCauseEditDlg* dialog = new StructDataCauseEditDlg(initialData, parent);
dialog->setAttribute(Qt::WA_DeleteOnClose);
// 对话框关闭时提交数据
connect(dialog, &StructDataCauseEditDlg::finished,
this, [this, dialog](int result) {
StructDataMeasurementDelegate* nonConstThis =
const_cast<StructDataMeasurementDelegate*>(this);
if (result == QDialog::Accepted) {
emit nonConstThis->commitData(dialog);
}
emit nonConstThis->closeEditor(dialog);
});
return dialog;
}
QWidget* StructDataMeasurementDelegate::createCauseYXEditor(QWidget* parent) const
{
QComboBox* comboBox = new QComboBox(parent);
comboBox->addItems({"raising", "falling"});
return comboBox;
}
QWidget* StructDataMeasurementDelegate::createCommandEditor(QWidget* parent) const
{
QComboBox* comboBox = new QComboBox(parent);
comboBox->addItems({"info", "warning", "error", "critical", "exception"});
return comboBox;
}
QWidget* StructDataMeasurementDelegate::createActionParaEditor(QWidget* parent) const
{
StructDataActionParaDlg* dlg = new StructDataActionParaDlg(parent);
return dlg;
}
QString StructDataMeasurementDelegate::getParaType(const QModelIndex& index) const
{
QModelIndex typeIndex = index.sibling(index.row(), StructDataMeasurementModel::ColType);
return typeIndex.data(Qt::DisplayRole).toString();
}