Как сделать такое:
В столбце таблицы ячейки закрашены заданными цветами
Пользователь щёлкает по ячейке таблицы, вылезает QColorDialog, ячейка красится в выбранный цвет
Строго QTableView, а не QTableWidget.
Пишу делегата. После задания цвета мелькает нужный цвет и ячейка становится белой. При выборе другой ячейки предыдущая красится в выбранный цвет. Что не правильно?
C++ (Qt)
class ColorDelegate : public QItemDelegate
{
Q_OBJECT
public:
ColorDelegate(QObject *parent = 0);
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
const QModelIndex &index) const;
void setEditorData(QWidget *editor, const QModelIndex &index) const;
void setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const;
void updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &index) const;
void paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const;
};
C++ (Qt)
QWidget *ColorDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &/* option */,
const QModelIndex & index ) const
{
QWidget* editor = new QWidget(parent);
QHBoxLayout* ly = new QHBoxLayout(editor);
editor->setAutoFillBackground(true);
QVariant value = index.model()->data(index, Qt::UserRole + 1);
QColor c = value.value<QColor>();
c = QColorDialog::getColor(c, 0, tr("Выбор цвета"), QColorDialog::ShowAlphaChannel);
QVariant newValue(c);
QAbstractItemModel* model = const_cast<QAbstractItemModel*>(index.model());
model->setData(index, newValue, Qt::UserRole + 1);
editor->setPalette(QPalette(c));
qApp->processEvents();
return editor;
}
void ColorDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
}
void ColorDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
}
void ColorDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
editor->setGeometry(option.rect);
}
void ColorDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
QVariant value = index.model()->data(index, Qt::UserRole + 1);
QColor c = value.value<QColor>();
painter->fillRect(option.rect, c);
}
QColorDialog::getColor надо вызывать в слоте, который клик обрабатывает, а не в createEditor.