/
friendlyperch
/
QGrid
Обзор
Документация
Войти
/
friendlyperch
/
QGrid
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
dev-ver1
src/delegates/UniversalDelegate.cpp
199 строк
6 KB
friendlyperch
add review notes, fix case-sensitive includes and Qt6.10 filter API
18 апр 2026, 18:13
18 апр 2026, 18:13
1b6df60
Код
Авторство
О чём код?
#include "UniversalDelegate.h" #include "models/FilterProxyModel.h" #include "models/UniversalTableModel.h" #include "QGrid/GridColumn.h" #include "QGrid/CellRenderer.h" #include <QApplication> #include <QCheckBox> #include <QMouseEvent> #include <QPainter> #include <QStyleOptionButton> UniversalDelegate::UniversalDelegate(QObject *parent) : QItemDelegate(parent) { } QWidget *UniversalDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { Q_UNUSED(option) GridColumn *column = getColumnByIndex(index); if (!column) return nullptr; ColumnEditorDelegate *delegate = column->getEditorDelegate(); if (!delegate) return nullptr; QWidget *widget = delegate->createEditor(parent); return widget; } void UniversalDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { QVariant data = index.model()->data(index, Qt::EditRole); GridColumn *column = getColumnByIndex(index); if (!column) return; if (column->getValueFunc() != nullptr) data = column->getValueFunc()(data); ColumnEditorDelegate *delegate = column->getEditorDelegate(); if (delegate) { delegate->setEditorData(editor, data); } } void UniversalDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { GridColumn *const column = getColumnByIndex(index); if (!column) return; ColumnEditorDelegate *delegate = column->getEditorDelegate(); if (delegate) { QVariant value = delegate->getEditorData(editor); model->setData(index, value, Qt::EditRole); } } void UniversalDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const { Q_UNUSED(option) Q_UNUSED(index) editor->setGeometry(option.rect); } void UniversalDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { GridColumn *column = getColumnByIndex(index); if (!column) return; CellRenderer *cellRenderer = column->getCellRenderer(); if (cellRenderer) { QVariant data = index.model()->data(index, Qt::DisplayRole); if (column->getValueFunc() != nullptr) { data = column->getValueFunc()(data); } cellRenderer->paint(painter, option, data); return; } if (column->getCheckable()) { QStyleOptionViewItem opt = option; opt.text = QString(); opt.icon = QIcon(); opt.features = QStyleOptionViewItem::None; opt.checkState = Qt::Unchecked; QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter); QVariant checkState = index.data(Qt::CheckStateRole); Qt::CheckState state = static_cast<Qt::CheckState>(checkState.toInt()); QStyleOptionButton checkboxOption; checkboxOption.rect = option.rect; checkboxOption.state = option.state; checkboxOption.state |= (state == Qt::Checked) ? QStyle::State_On : QStyle::State_Off; checkboxOption.state |= QStyle::State_Enabled; QRect checkRect = QApplication::style()->subElementRect(QStyle::SE_CheckBoxIndicator, &checkboxOption, nullptr); checkRect.moveCenter(option.rect.center()); checkboxOption.rect = checkRect; QApplication::style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &checkboxOption, painter); return; } if (!column->getShowDelegateInView()) { QItemDelegate::paint(painter, option, index); return; } QWidget *widget = createEditor(nullptr, option, index); setEditorData(widget, index); widget->resize(option.rect.size()); painter->drawPixmap(option.rect, widget->grab()); widget->deleteLater(); } bool UniversalDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) { if (event->type() == QEvent::MouseButtonPress || event->type() == QEvent::MouseButtonDblClick) { GridColumn *column = getColumnByIndex(index); if (!column) return QItemDelegate::editorEvent(event, model, option, index); if (column->getCheckable() && mode == Mode::ReadWrite) { QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event); if (mouseEvent->button() == Qt::LeftButton) { QStyleOptionButton checkboxOption; checkboxOption.rect = option.rect; QRect checkRect = QApplication::style()->subElementRect(QStyle::SE_CheckBoxIndicator, &checkboxOption, nullptr); checkRect.moveCenter(option.rect.center()); QPoint mousePos = mouseEvent->pos(); if (checkRect.contains(mousePos)) { QVariant currentValue = index.data(Qt::CheckStateRole); Qt::CheckState currentState = static_cast<Qt::CheckState>(currentValue.toInt()); Qt::CheckState newState = (currentState == Qt::Checked) ? Qt::Unchecked : Qt::Checked; bool success = model->setData(index, newState, Qt::CheckStateRole); if (success) { event->accept(); return true; } } } } } return QItemDelegate::editorEvent(event, model, option, index); } Mode UniversalDelegate::getMode() const { return mode; } void UniversalDelegate::setMode(const Mode &value) { mode = value; } GridColumn *UniversalDelegate::getColumnByIndex(const QModelIndex &index) const { const QAbstractItemModel *targetModel = index.model(); auto proxyModel = qobject_cast<const QSortFilterProxyModel *>(targetModel); QModelIndex sourceIndex = index; if (proxyModel) { sourceIndex = proxyModel->mapToSource(index); } auto sourceModel = qobject_cast<UniversalTableModel *>(const_cast<QAbstractItemModel *>(sourceIndex.model())); if (!sourceModel) return nullptr; return sourceModel->getColumn(sourceIndex.column()); }