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))));