1 #include "multicombobox.h"
5 class MultiComboBoxEditor :
public QCheckBox
8 MultiComboBoxEditor(QWidget* parent)
14 bool hitButton(
const QPoint& pos)
const
20 return QAbstractButton::hitButton(pos);
26 class MultiComboBoxDelegate :
public QItemDelegate
30 MultiComboBoxDelegate(QObject *parent)
31 : QItemDelegate(parent)
35 void paint(QPainter *painter,
const QStyleOptionViewItem &option,
36 const QModelIndex &index)
const
39 bool value = index.data(Qt::UserRole).toBool();
40 QString text = index.data(Qt::DisplayRole).toString();
43 const QStyle *style = QApplication::style();
44 QStyleOptionButton opt;
45 opt.state |= value ? QStyle::State_On : QStyle::State_Off;
46 opt.state |= QStyle::State_Enabled;
48 opt.rect = option.rect;
51 style->drawControl(QStyle::CE_CheckBox,&opt,painter);
54 QWidget *createEditor(QWidget *parent,
55 const QStyleOptionViewItem & option ,
56 const QModelIndex & index )
const
58 return new MultiComboBoxEditor(parent);
61 void setEditorData(QWidget *editor,
const QModelIndex &index)
const
63 QCheckBox *myEditor =
static_cast<QCheckBox*
>(editor);
64 myEditor->setText(index.data(Qt::DisplayRole).toString());
65 myEditor->setChecked(index.data(Qt::UserRole).toBool());
68 void setModelData(QWidget *editor, QAbstractItemModel *model,
69 const QModelIndex &index)
const
72 QCheckBox *myEditor =
static_cast<QCheckBox*
>(editor);
73 bool value = myEditor->isChecked();
77 QMap<int,QVariant> data;
78 data.insert(Qt::DisplayRole,myEditor->text());
79 data.insert(Qt::UserRole,value);
80 model->setItemData(index,data);
83 void updateEditorGeometry(QWidget *editor,
84 const QStyleOptionViewItem &option,
const QModelIndex &index )
const
86 editor->setGeometry(option.rect);
92 MultiComboBox::MultiComboBox(QWidget *widget )
95 view()->setItemDelegate(
new MultiComboBoxDelegate(
this));
97 view()->setEditTriggers(QAbstractItemView::CurrentChanged);
98 view()->viewport()->installEventFilter(
this);
99 view()->setAlternatingRowColors(
true);
103 MultiComboBox::~MultiComboBox()
107 QString MultiComboBox::displayText()
const
109 return selectedItemTexts().join(
", ");
112 bool MultiComboBox::eventFilter(QObject *
object, QEvent *event)
114 if (
object == view()->viewport())
116 if (handleViewViewportEvent(event))
121 return QComboBox::eventFilter(
object,event);
124 bool MultiComboBox::handleViewViewportEvent(QEvent* event)
126 switch (event->type())
140 view()->edit(model()->index(0, 0));
144 case QEvent::MouseButtonRelease:
153 void MultiComboBox::paintEvent(QPaintEvent *)
155 QStylePainter painter(
this);
156 painter.setPen(palette().color(QPalette::Text));
159 QStyleOptionComboBox opt;
160 initStyleOption(&opt);
163 opt.currentText = displayText();
164 painter.drawComplexControl(QStyle::CC_ComboBox, opt);
165 painter.drawControl(QStyle::CE_ComboBoxLabel, opt);
168 QStringList MultiComboBox::selectedItemTexts()
const
171 for (
int i = 0; i < count(); ++i)
173 bool checked = itemData(i).toBool();
176 result << itemText(i);
182 void MultiComboBox::setSelectedTexts(
const QStringList& texts)
184 for (
int i = 0; i < count(); ++i)
186 setItemData(i, static_cast<bool>(texts.contains(itemText(i))));