class SelMunObrMolel(QAbstractListModel): def flags(self, index): ret = super(SelMunObrMolel, self).flags(index) if ret != QtCore.Qt.ItemFlags(): return ret | QtCore.Qt.ItemIsUserCheckable def data(self, index, role=QtCore.Qt.DisplayRole): if not index.isValid() or index.row() >= len(self.objects): return QtCore.QVariant() if role == QtCore.Qt.CheckStateRole: is_checked = self.objects[index.row()].is_checked return QtCore.QVariant( (QtCore.Qt.Unchecked, QtCore.Qt.Checked)[is_checked] ) return super(SelMunObrMolel, self).data(index, role) def setData(self, index, value, role=QtCore.Qt.DisplayRole): if not index.isValid() or index.row() >= len(self.objects): return False if role == QtCore.Qt.CheckStateRole: obj = self.objects[index.row()] obj.is_checked = value == QtCore.QVariant(QtCore.Qt.Checked) return True return super(SelMunObrMolel, self).setData(index, value, role)
// Enable editing on items viewview()->setEditTriggers(QAbstractItemView::CurrentChanged);
#include "qcombocheckbox.h"#include <QListView>#include <QMouseEvent>////////////////////////////////////////////////////////////////////////////////////// конструктор////////////////////////////////////////////////////////////////////////////////////QComboCheckBox::QComboCheckBox(QWidget *parent) : QComboBox(parent){ // заменяем стандартный вьювер m_listView = new QListView(this); setView(m_listView); // устанавливаем перехват событий m_listView->viewport()->installEventFilter(this); // флаг открытия комбобокса m_opening = false;}////////////////////////////////////////////////////////////////////////////////// Перехватчик событий для работы чекбоксов////////////////////////////////////////////////////////////////////////////////bool QComboCheckBox::eventFilter(QObject * watched, QEvent * event){ // проверка тика отловленного события if (event->type() == QEvent::MouseButtonRelease) { // блокируем смену галочки при открытии if (m_opening) { m_opening = false; return QObject::eventFilter(watched, event); } // проверяем тип if (watched->parent()->inherits("QListView")) { // приводим к нужным типам QListView *tmp = (QListView *)(watched->parent()); QMouseEvent *mEvent = (QMouseEvent *)event; QModelIndex ind = tmp->indexAt(mEvent->pos()); // меняем состояние cheched bool checked = tmp->model()->data(ind,Qt::CheckStateRole).toBool(); tmp->model()->setData(ind,!checked,Qt::CheckStateRole); // блокируем закрытие комбобокса return true; } } return QObject::eventFilter(watched, event);}////////////////////////////////////////////////////////////////////////////////// функция раскрытия комбобокса////////////////////////////////////////////////////////////////////////////////void QComboCheckBox::showPopup(){ // флаг открытия комбобокса m_opening = true; // вызываем функцию класса - предка QComboBox::showPopup();}
//qcombocheckbox.h#include <QtGui>class QComboCheckBox: public QComboBox{ Q_OBJECT;public: QComboCheckBox(QWidget *widget = 0); virtual ~QComboCheckBox(); bool eventFilter(QObject * watched, QEvent * event); void showPopup();private: QListView * m_listView; bool m_opening;};
QComboCheckBox * comboCheckBox = new QComboCheckBox(this); QSqlQueryModel * comboCheckModel = new QSqlQueryModel; comboCheckModel->setQuery("SELECT \"Kop\" FROM \"Opers\" "); comboCheckBox->setModel(comboCheckModel); comboCheckBox->show();