Уже мозги все сломал как правильно задать гуглю вопрос. Подскажите следующее:
Создал объект QTreeView (тоже и с QTableView) подключил к нему model (QStandardItemModel)
Подкючаю делегаты с QLineEdit и QComboBox в качестве редакторов.
Все ок все работает. Осталось дело за наведением красоты.
Активная строка/ячейка в QTreeView/QTableView выделяется стандартно неким образом зависящем от ОС. Обобщено говоя эта некая градиентная заливка. Но вот ячейки у которых назначены делеаты (но еще не активированы кликом) залиты сплошным цветом. Получается не красиво - вся строка одним образом, а ячейки с делегатами другим. Эта ситуация и в Windows7 и в KDE4.
Делегаты прикручиваю следующим образом:
tree->setItemDelegateForColumn(3,delegate);
Класс делегата реализован так:
#ifndef VCOMBOBOXDELEGATE_H
#define VCOMBOBOXDELEGATE_H
#include <QItemDelegate>
class VComboBoxDelegate : public QItemDelegate
{
private:
QSize editorSize;
public:
VComboBoxDelegate(QObject *parent,QStringList iList = QStringList());
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;
QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const;
QStringList list;
};
#endif // VCOMBOBOXDELEGATE_H
#include "vcomboboxdelegate.h"
#include <QComboBox>
#include <QEvent>
VComboBoxDelegate::VComboBoxDelegate(QObject *parent,QStringList iList)
:QItemDelegate(parent)
{
// Object for calculate of editor size for some GUI themes
QComboBox *editor = new QComboBox(static_cast<QWidget*>(parent));
editor->setFrame(false);
editor->adjustSize();
editorSize = QSize(100,editor->height()*0.9);
delete editor;
this->list=iList;
}
QWidget *VComboBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/*option*/, const QModelIndex &/*index*/) const
{
QComboBox *editor = new QComboBox(parent);
editor->addItems(this->list);
return editor;
}
void VComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QString value = index.model()->data(index, Qt::EditRole).toString();
QComboBox *comboBox = static_cast<QComboBox*>(editor);
comboBox->setCurrentIndex(comboBox->findData(value,Qt::EditRole,Qt::MatchExactly));
}
void VComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QComboBox *comboBox = static_cast<QComboBox*>(editor);
model->setData(index, comboBox->currentText(), Qt::EditRole);
}
void VComboBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/*index*/) const
{
editor->setGeometry(option.rect);
}
QSize VComboBoxDelegate::sizeHint ( const QStyleOptionViewItem &/*option*/, const QModelIndex &/*index*/) const
{
return editorSize;
}