У меня в таблице ячейки могут иметь два значения (иконки), которые могут отдельно выделяться.
Сделал делегат и для состояния выделения определял на какой половине ячейки находится курсор и менял положение рамки выделения,
но такая реализация оказалась с тормозами -- при переключении внутри ячейки видна задержка и если после клика на одну половину переместить курсор, то выделение может оказаться на другой половине
Мне нужна возможность выделения части ячейки с возможностью определять что выделено. В рабочем проекте использую: QTableView и QAbstractTableModel
Привожу код и архив с минимальным проектом.
celldelegate.hC++ (Qt)
#ifndef CELLDELEGATE_H
#define CELLDELEGATE_H
#include <QStyledItemDelegate>
class CellDelegate : public QStyledItemDelegate
{
public:
CellDelegate(QWidget* parent = 0);
protected:
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
#endif // CELLDELEGATE_H
celldelegate.cppC++ (Qt)
#include "celldelegate.h"
#include <QPainter>
#include <QDebug>
CellDelegate::CellDelegate(QWidget* parent)
: QStyledItemDelegate(parent) {
}
void CellDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {
// Цвет выделения полупрозрачный, чтобы были видно что в ячейке
QStyleOptionViewItem itemOption(option);
initStyleOption(&itemOption, index);
if (itemOption.state & QStyle::State_Selected) {
QPoint pos = dynamic_cast <QWidget*> (parent())->mapFromGlobal(QCursor::pos());
QRect& rect = itemOption.rect;
bool leftSide = (rect.x() + (rect.width() / 2)) > pos.x();
if (leftSide) {
rect.setWidth(rect.width() / 2);
} else {
rect.setX(rect.x() + rect.width() / 2);
}
QColor color = itemOption.palette.color(QPalette::Highlight);
color.setAlpha(180);
itemOption.palette.setColor(QPalette::Highlight, color);
}
QStyledItemDelegate::paint(painter, itemOption, index);
}
widget.hC++ (Qt)
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTableWidget>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
private:
QTableWidget table;
};
#endif // WIDGET_H
widget.cppC++ (Qt)
#include "widget.h"
#include <QVBoxLayout>
#include "celldelegate.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
QVBoxLayout* layout = new QVBoxLayout();
layout->addWidget(&table);
table.setSelectionBehavior(QAbstractItemView::SelectItems);
table.setSelectionMode(QAbstractItemView::SingleSelection);
table.setItemDelegate(new CellDelegate(table.viewport()));
table.setRowCount(3);
table.setColumnCount(3);
setLayout(layout);
}