-
Notifications
You must be signed in to change notification settings - Fork 1
/
cdelegate.cpp
106 lines (92 loc) · 3.75 KB
/
cdelegate.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include "cdelegate.h"
#include "types.h"
#include <QDebug>
#include <QLineEdit>
#include <QDoubleSpinBox>
#include <QComboBox>
QWidget *CDelegate::createCellEditor(const CUserData *cell, QWidget *parent) const
{
if(TCell::TCELL_NONE == cell->user_type())
{
/// пустая ячейка без данных
qDebug() << Q_FUNC_INFO << "TCELL_NONE, algorithm error!"; //сюда не должны попадать, т.к. у пустых ячеек нет флага редактирования
}
else if(TCell::TCELL_DOUBLE == cell->user_type())
{
QDoubleSpinBox *doubleSpinbox = new QDoubleSpinBox(parent);
doubleSpinbox->setDecimals(6);// WARNING при открытии этого делегата точность числа будет уменьшена
doubleSpinbox->setValue(cell->toDouble());
return doubleSpinbox;
}
else if(TCell::TCELL_BOOL == cell->user_type())
{
QComboBox *comboBox = new QComboBox(parent);
comboBox->addItem("TRUE", true);
comboBox->addItem("FALSE", false);
comboBox->setCurrentIndex(cell->toBool() ? 0 : 1);
return comboBox;
}
else if(TCell::TCELL_STR == cell->user_type())
{
QLineEdit *lineedit = new QLineEdit(parent);
lineedit->setText(cell->toString());
lineedit->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
return lineedit;
}
return nullptr;
}
QWidget *CDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
Q_UNUSED(option)
if(index.isValid())
{
CUserData cell_data = qvariant_cast<CUserData>(index.data(Qt::EditRole));
QWidget *w = createCellEditor(&cell_data, parent);
return w;
}
return nullptr;
}
void CDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
CUserData cell_data = qvariant_cast<CUserData>(index.data(Qt::EditRole));
if(TCell::TCELL_DOUBLE == cell_data.user_type()){
QDoubleSpinBox *doubleSpinbox = qobject_cast<QDoubleSpinBox*>(editor);
qDebug() << Q_FUNC_INFO << cell_data.toDouble();
doubleSpinbox->setValue(cell_data.toDouble());
}
else if(TCell::TCELL_BOOL == cell_data.user_type()){
QComboBox *comboBox = qobject_cast<QComboBox*>(editor);
comboBox->setCurrentIndex(cell_data.toBool() ? 0 : 1);
}
else if(TCell::TCELL_STR == cell_data.user_type()){
QLineEdit *lineedit = qobject_cast<QLineEdit*>(editor);
lineedit->setText(cell_data.toString());
}
}
void CDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
CUserData cell_data = qvariant_cast<CUserData>(index.data(Qt::EditRole));
if(TCell::TCELL_DOUBLE == cell_data.user_type()){
QDoubleSpinBox *doubleSpinbox = qobject_cast<QDoubleSpinBox*>(editor);
cell_data.setValue(doubleSpinbox->value());
cell_data.setIs_empty(false);
model->setData(index, QVariant::fromValue(cell_data));
}
else if(TCell::TCELL_BOOL == cell_data.user_type()){
QComboBox *comboBox = qobject_cast<QComboBox*>(editor);
cell_data.setValue(comboBox->currentData().toBool());
cell_data.setIs_empty(false);
model->setData(index, QVariant::fromValue(cell_data));
}
else if(TCell::TCELL_STR == cell_data.user_type()){
QLineEdit *lineedit = qobject_cast<QLineEdit*>(editor);
cell_data.setValue(lineedit->text());
cell_data.setIs_empty(false);
model->setData(index, QVariant::fromValue(cell_data));
}
}
void CDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
Q_UNUSED(index)
editor->setGeometry(option.rect);
}