DiagramDesigner/diagramCavas/source/diagramEditor/wizardBusTableDelegate.cpp

221 lines
8.4 KiB
C++

#include <QComboBox>
#include <QEvent>
#include <QDialog>
#include <QPushButton>
#include <QVBoxLayout>
#include <QLabel>
#include "diagramEditor/wizardBusTableDelegate.h"
#include "global.h"
WizardBusTableDelegate::WizardBusTableDelegate(QObject *parent)
: QStyledItemDelegate(parent)
{
};
WizardBusTableDelegate::~WizardBusTableDelegate()
{
}
QWidget* WizardBusTableDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option,
const QModelIndex& index) const
{
if(index.column() == 1) //电压
{
QComboBox *editor = new QComboBox(parent);
editor->addItem("220KV",QVariant(220));
editor->addItem("110KV",QVariant(110));
editor->addItem("35KV",QVariant(35));
editor->addItem("10KV",QVariant(10));
editor->addItem("6KV",QVariant(6));
editor->addItem("0.4KV",QVariant(0.4));
return editor;
}
else if(index.column() == 2) //单双母
{
QComboBox *editor = new QComboBox(parent);
editor->addItem("双母线",2);
editor->addItem("单母线",1);
return editor;
}
else if(index.column() == 4) //接线方式
{
QComboBox *editor = new QComboBox(parent);
editor->addItems({"分段连接"});
return editor;
}
return nullptr;
}
void WizardBusTableDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
{
if(index.column() == 1 || index.column() == 2 || index.column() == 4)
{
QComboBox* comboBox = static_cast<QComboBox*>(editor);
comboBox->setCurrentText(index.data(Qt::EditRole).toString());
}
}
void WizardBusTableDelegate::setModelData(QWidget* editor, QAbstractItemModel* model,
const QModelIndex& index) const
{
if(index.column() == 1 || index.column() == 2 || index.column() == 4)
{
QComboBox* comboBox = static_cast<QComboBox*>(editor);
QVariant data = comboBox->currentData();
QVariant lastData = index.data(Qt::UserRole);
//model->setData(index,lastData,Qt::UserRole+1); //将旧数据保存到role+1
model->setData(index, comboBox->currentText(), Qt::EditRole);
model->setData(index, data, Qt::UserRole); // 关联数据
//if(index.data(Qt::UserRole) != index.data(Qt::UserRole+1)) //状态改变时才发送
{
emit editingFinished(index, data.toString()); //发送自定义信号
}
}
}
bool WizardBusTableDelegate::editorEvent(QEvent* event, QAbstractItemModel* model,
const QStyleOptionViewItem& option, const QModelIndex& index)
{
if (event->type() == QEvent::MouseButtonPress) {
if(index.column() == 3)
{
QDialog dialog(option.widget->parentWidget());
dialog.setWindowTitle("选择分段");
dialog.resize(300, 150);
QModelIndex typeIndex = index.sibling(index.row(), 2);
int nData = typeIndex.data(Qt::UserRole).toInt();
if(nData == 2) //双母
{
// 创建两个组合框并添加数据
QComboBox *combo1 = new QComboBox(&dialog);
combo1->addItem("不分段", QVariant(1));
combo1->addItem("2", QVariant(2));
combo1->addItem("3", QVariant(3));
combo1->addItem("4", QVariant(4));
combo1->addItem("5", QVariant(5));
combo1->addItem("6", QVariant(6));
combo1->addItem("7", QVariant(7));
combo1->addItem("8", QVariant(8));
QComboBox *combo2 = new QComboBox(&dialog);
combo2->addItem("不分段", QVariant(1));
combo2->addItem("2", QVariant(2));
combo2->addItem("3", QVariant(3));
combo2->addItem("4", QVariant(4));
combo2->addItem("5", QVariant(5));
combo2->addItem("6", QVariant(6));
combo2->addItem("7", QVariant(7));
combo2->addItem("8", QVariant(8));
// 确定按钮
QPushButton *btnOk = new QPushButton("确定", &dialog);
connect(btnOk, &QPushButton::clicked, &dialog, &QDialog::accept);
// 布局
QVBoxLayout *layout = new QVBoxLayout(&dialog);
QLabel *label1 = new QLabel("母线1:", &dialog);
layout->addWidget(label1);
layout->addWidget(combo1);
QLabel *label2 = new QLabel("母线2:", &dialog);
layout->addWidget(label2);
layout->addWidget(combo2);
QHBoxLayout *btnLayout = new QHBoxLayout;
btnLayout->addStretch();
btnLayout->addWidget(btnOk);
layout->addLayout(btnLayout);
// 显示对话框
if (dialog.exec() == QDialog::Accepted) {
// 获取两个组合框的文本和数据
QString text1 = combo1->currentText();
QVariant data1 = combo1->currentData();
QString text2 = combo2->currentText();
QVariant data2 = combo2->currentData();
// 组合显示文本
QString displayText = text1 + ";" + text2;
// 组合数据(使用自定义格式)
QVariant combinedData = QString("%1,%2").arg(data1.toInt()).arg(data2.toInt());
// 保存到模型
model->setData(index, displayText, Qt::DisplayRole); // 显示文本
model->setData(index, combinedData, Qt::UserRole); // 关联数据
emit editingFinished(index, combinedData.toString());
}
}
else{ //单母
// 1个组合框并添加数据
QComboBox *combo1 = new QComboBox(&dialog);
combo1->addItem("不分段", QVariant(1));
combo1->addItem("2", QVariant(2));
combo1->addItem("3", QVariant(3));
combo1->addItem("4", QVariant(4));
combo1->addItem("5", QVariant(5));
combo1->addItem("6", QVariant(6));
combo1->addItem("7", QVariant(7));
combo1->addItem("8", QVariant(8));
// 确定按钮
QPushButton *btnOk = new QPushButton("确定", &dialog);
connect(btnOk, &QPushButton::clicked, &dialog, &QDialog::accept);
// 布局
QHBoxLayout *layout = new QHBoxLayout(&dialog);
QLabel *label1 = new QLabel("母线:", &dialog);
layout->addWidget(label1);
layout->addWidget(combo1);
QVBoxLayout *btnLayout = new QVBoxLayout;
btnLayout->addStretch();
btnLayout->addWidget(btnOk);
layout->addLayout(btnLayout);
// 显示对话框
if (dialog.exec() == QDialog::Accepted) {
// 获取两个组合框的文本和数据
QString text1 = combo1->currentText();
QVariant data1 = combo1->currentData();
// 组合显示文本
QString displayText = "分段:"+text1;
// 组合数据(使用自定义格式)
QVariant combinedData = QString("%1").arg(data1.toInt());
// 保存到模型
model->setData(index, displayText, Qt::DisplayRole); // 显示文本
model->setData(index, combinedData, Qt::UserRole); // 关联数据
emit editingFinished(index, combinedData.toString());
}
}
return true;
}
}
return QStyledItemDelegate::editorEvent(event, model, option, index);
}
/*void WizardBusTableDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
//根据行号设置交替色
QStyleOptionViewItem opt = option;
initStyleOption(&opt, index);
QModelIndex firstColIndex = index.sibling(index.row(), 0);
TableItemState state = TableItemState(firstColIndex.data(Qt::UserRole).toInt());
//先执行默认绘制(包括背景、文本等基础元素)
QStyledItemDelegate::paint(painter, opt, index);
}*/