...делаешь свой делегат, мой пример:
C++ (Qt)
C++ (QT)
// .h
class SpreadSheetDelegate : public QItemDelegate
{
Q_OBJECT
public:
SpreadSheetDelegate(QObject *parent = 0);
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const;
void setEditorData(QWidget *editor, const QModelIndex &index) const;
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
protected:
QRegExp m_regExpVer;
};
// при необходимости переопределяшь ф-ю paint, что бы по своему отрисовывать ячейки...
// на твоем месте я бы там использовал QLabel, который понимает расширенный текст
// .cpp
SpreadSheetDelegate::SpreadSheetDelegate(QObject *parent)
: QItemDelegate(parent)
{
m_regExpVer.setPattern("[0,1]\\.[0-9]{,3}");
}
// здесь создешь свой виджет, с помощью которого будешь редактировать выбранный item
QWidget *SpreadSheetDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem& style,
const QModelIndex &index) const
{
int column = index.column();
if(column == 0){
QComboBox *editor = new QComboBox(parent);
editor->setEditable(true);
editor->setFrame(false);
editor->addItem("первый");
editor->addItem("второй");
//...
return editor;
}
if (column <= 4)
{
QLineEdit *editor = new QLineEdit(parent);
editor->setFrame(false);
if (column > 2)
editor->setValidator(new QDoubleValidator(parent));
else
editor->setValidator(new QRegExpValidator(m_regExpVer, parent));
return editor;
}
return QItemDelegate::createEditor(parent, style, index);
}
// здесь в соданный виджет-редактор устанавливаешь данные из модели
void SpreadSheetDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QComboBox *dateEditor = qobject_cast<QComboBox *>(editor);
if (dateEditor)
{
dateEditor->setEditText(index.model()->data(index, Qt::EditRole).toString());
}
else
{
QItemDelegate::setEditorData(editor, index);
}
}
// а здесь по окончании редактирования введеные данные переставляешь
// из виджета обратно в модель данных
void SpreadSheetDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
QLineEdit *edit = qobject_cast<QLineEdit *>(editor);
if (edit) {
model->setData(index, edit->text());
}
else {
QComboBox *dateEditor = qobject_cast<QComboBox *>(editor);
if (dateEditor) {
model->setData(index, dateEditor->currentText());
}
}
}
// в коде
tableWgt->setItemDelegate(new SpreadSheetDelegate());