1 #include "multicombobox.h" 2 #include <QAbstractItemView> 3 #include <QApplication> 5 #include <QItemDelegate> 6 #include <QStylePainter> 9 class MultiComboBoxEditor :
public QCheckBox
12 MultiComboBoxEditor(QWidget* parent)
18 bool hitButton(
const QPoint& pos)
const 24 return QAbstractButton::hitButton(pos);
30 class MultiComboBoxDelegate :
public QItemDelegate
34 MultiComboBoxDelegate(QObject *parent)
35 : QItemDelegate(parent)
39 void paint(QPainter *painter,
const QStyleOptionViewItem &option,
40 const QModelIndex &index)
const 43 bool value = index.data(Qt::UserRole).toBool();
44 QString text = index.data(Qt::DisplayRole).toString();
47 const QStyle *style = QApplication::style();
48 QStyleOptionButton opt;
49 opt.state |= value ? QStyle::State_On : QStyle::State_Off;
50 opt.state |= QStyle::State_Enabled;
52 opt.rect = option.rect;
55 style->drawControl(QStyle::CE_CheckBox,&opt,painter);
58 QWidget *createEditor(QWidget *parent,
59 const QStyleOptionViewItem & option ,
60 const QModelIndex & index )
const 62 return new MultiComboBoxEditor(parent);
65 void setEditorData(QWidget *editor,
const QModelIndex &index)
const 67 QCheckBox *myEditor =
static_cast<QCheckBox*
>(editor);
68 myEditor->setText(index.data(Qt::DisplayRole).toString());
69 myEditor->setChecked(index.data(Qt::UserRole).toBool());
72 void setModelData(QWidget *editor, QAbstractItemModel *model,
73 const QModelIndex &index)
const 76 QCheckBox *myEditor =
static_cast<QCheckBox*
>(editor);
77 bool value = myEditor->isChecked();
81 QMap<int,QVariant> data;
82 data.insert(Qt::DisplayRole,myEditor->text());
83 data.insert(Qt::UserRole,value);
84 model->setItemData(index,data);
87 void updateEditorGeometry(QWidget *editor,
88 const QStyleOptionViewItem &option,
const QModelIndex &index )
const 90 editor->setGeometry(option.rect);
96 MultiComboBox::MultiComboBox(QWidget *widget )
99 view()->setItemDelegate(
new MultiComboBoxDelegate(
this));
101 view()->setEditTriggers(QAbstractItemView::CurrentChanged);
102 view()->viewport()->installEventFilter(
this);
103 view()->setAlternatingRowColors(
true);
107 MultiComboBox::~MultiComboBox()
111 QString MultiComboBox::displayText()
const 113 return selectedItemTexts().join(
", ");
116 bool MultiComboBox::eventFilter(QObject *
object, QEvent *event)
118 if (
object == view()->viewport())
120 if (handleViewViewportEvent(event))
125 return QComboBox::eventFilter(
object,event);
128 bool MultiComboBox::handleViewViewportEvent(QEvent* event)
130 switch (event->type())
147 view()->edit(model()->index(0, 0));
151 case QEvent::MouseButtonRelease:
160 void MultiComboBox::paintEvent(QPaintEvent *)
162 QStylePainter painter(
this);
163 painter.setPen(palette().color(QPalette::Text));
166 QStyleOptionComboBox opt;
167 initStyleOption(&opt);
170 opt.currentText = displayText();
171 painter.drawComplexControl(QStyle::CC_ComboBox, opt);
172 painter.drawControl(QStyle::CE_ComboBoxLabel, opt);
175 QStringList MultiComboBox::selectedItemTexts()
const 178 for (
int i = 0; i < count(); ++i)
180 bool checked = itemData(i).toBool();
183 result << itemText(i);
189 void MultiComboBox::setSelectedTexts(
const QStringList& texts)
191 for (
int i = 0; i < count(); ++i)
193 setItemData(i, static_cast<bool>(texts.contains(itemText(i))));