23 #include "multicombobox.h"    24 #include <QAbstractItemView>    25 #include <QApplication>    27 #include <QItemDelegate>    28 #include <QStylePainter>    31 class MultiComboBoxEditor : 
public QCheckBox
    34         MultiComboBoxEditor(QWidget* parent)
    40         bool hitButton(
const QPoint& pos)
 const    46                 return QAbstractButton::hitButton(pos);
    52 class MultiComboBoxDelegate : 
public QItemDelegate
    56         MultiComboBoxDelegate(QObject *parent)
    57                 : QItemDelegate(parent)
    61         void paint(QPainter *painter, 
const QStyleOptionViewItem &option,
    62                 const QModelIndex &index)
 const    65                 bool value = index.data(Qt::UserRole).toBool();
    66                 QString text = index.data(Qt::DisplayRole).toString();
    69                 const QStyle *style = QApplication::style();
    70                 QStyleOptionButton opt;
    71                 opt.state |= value ? QStyle::State_On : QStyle::State_Off;
    72                 opt.state |= QStyle::State_Enabled;
    74                 opt.rect = option.rect;
    77                 style->drawControl(QStyle::CE_CheckBox,&opt,painter);
    80         QWidget *createEditor(QWidget *parent,
    81                 const QStyleOptionViewItem & option ,
    82                 const QModelIndex & index )
 const    84                 return new MultiComboBoxEditor(parent);
    87         void setEditorData(QWidget *editor, 
const QModelIndex &index)
 const    89                 QCheckBox *myEditor = 
static_cast<QCheckBox*
>(editor);
    90                 myEditor->setText(index.data(Qt::DisplayRole).toString());
    91                 myEditor->setChecked(index.data(Qt::UserRole).toBool());
    94         void setModelData(QWidget *editor, QAbstractItemModel *model,
    95                 const QModelIndex &index)
 const    98                 QCheckBox *myEditor = 
static_cast<QCheckBox*
>(editor);
    99                 bool value = myEditor->isChecked();
   103                 QMap<int,QVariant> data;
   104                 data.insert(Qt::DisplayRole,myEditor->text());
   105                 data.insert(Qt::UserRole,value);
   106                 model->setItemData(index,data);
   109         void updateEditorGeometry(QWidget *editor,
   110                 const QStyleOptionViewItem &option, 
const QModelIndex &index )
 const   112                 editor->setGeometry(option.rect);
   118 MultiComboBox::MultiComboBox(QWidget *widget )
   121         view()->setItemDelegate(
new MultiComboBoxDelegate(
this));
   123         view()->setEditTriggers(QAbstractItemView::CurrentChanged);
   124         view()->viewport()->installEventFilter(
this);
   125         view()->setAlternatingRowColors(
true);
   129 MultiComboBox::~MultiComboBox()
   133 QString MultiComboBox::displayText()
 const   135         return selectedItemTexts().join(
", ");
   138 bool MultiComboBox::eventFilter(QObject *
object, QEvent *event)
   140         if (
object == view()->viewport())
   142                 if (handleViewViewportEvent(event))
   147         return QComboBox::eventFilter(
object,event);
   150 bool MultiComboBox::handleViewViewportEvent(QEvent* event)
   152         switch (event->type())
   169                                 view()->edit(model()->index(0, 0));
   173                 case QEvent::MouseButtonRelease:
   182 void MultiComboBox::paintEvent(QPaintEvent *)
   184         QStylePainter painter(
this);
   185         painter.setPen(palette().color(QPalette::Text));
   188         QStyleOptionComboBox opt;
   189         initStyleOption(&opt);
   192         opt.currentText = displayText();
   193         painter.drawComplexControl(QStyle::CC_ComboBox, opt);
   194         painter.drawControl(QStyle::CE_ComboBoxLabel, opt);
   197 QStringList MultiComboBox::selectedItemTexts()
 const   200         for (
int i = 0; i < count(); ++i)
   202                 bool checked = itemData(i).toBool();
   205                         result << itemText(i);
   211 void MultiComboBox::setSelectedTexts(
const QStringList& texts)
   213         for (
int i = 0; i < count(); ++i)
   215                 setItemData(i, static_cast<bool>(texts.contains(itemText(i))));