Я не умею программировать, поэтому набросала примерный код, чтобы была ясна основная идея. Вам лучше реализовать все по стандартам Qt. Виртуальные методы для редактирования я переопределять не стала. Посмотрев код вы поймете как это сделать.
#ifndef ____IX2_DELEGATE_H
#define ____IX2_DELEGATE_H
#include <QStyledItemDelegate>
class ix2Delegate : public QStyledItemDelegate
{
Q_OBJECT
public:
explicit ix2Delegate(QObject *parent = 0);
virtual void paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const;
virtual QSize sizeHint(const QStyleOptionViewItem &option,
const QModelIndex &index) const;
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index);
private:
QStyle::State btnState;
};
#endif // ____IX2_DELEGATE_H
#include "ix2delegate.h"
#include <QStandardItemModel>
#include <QPainter>
#include <QStyleOptionButton>
#include <QApplication>
#include <QMouseEvent>
const int margin = 10;
ix2Delegate::ix2Delegate(QObject *parent) :
QStyledItemDelegate(parent)
{
btnState = QStyle::State_Enabled;
}
void ix2Delegate::paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
QStyleOptionViewItemV4 optV4(option);
this->initStyleOption(&optV4,index);
QString modelText = optV4.text;
QString buttonText("Test Text");
QFontMetrics fm (optV4.fontMetrics);
QRect txtRect(optV4.rect.x(),optV4.rect.y(),fm.width(modelText)+margin,optV4.rect.height());
QRect btnRect(optV4.rect.x()+txtRect.width(),optV4.rect.y(),fm.width(buttonText)+margin,optV4.rect.height());
QStyleOptionButton btnOpt;
btnOpt.rect = btnRect;
btnOpt.text = buttonText;
btnOpt.state = btnState | QStyle::State_Enabled;
QApplication::style()->drawControl(QStyle::CE_PushButton, &btnOpt, painter);
QApplication::style()->drawItemText(painter,txtRect,Qt::AlignLeft|Qt::AlignVCenter,optV4.palette,true,modelText);
}
QSize ix2Delegate::sizeHint(const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
QStyleOptionViewItemV4 optV4(option);
this->initStyleOption(&optV4,index);
QFontMetrics fm (optV4.fontMetrics);
return QSize(fm.width(optV4.text)+fm.width("Test Text")+20,fm.height()+10);
}
bool ix2Delegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
if( event->type() == QEvent::MouseButtonPress ||
event->type() == QEvent::MouseButtonRelease ) {
} else {
btnState = QStyle::State_Raised;
return true;
}
QStyleOptionViewItemV4 optV4(option);
this->initStyleOption(&optV4,index);
QFontMetrics fm (optV4.fontMetrics);
QRect actRect(optV4.rect.x()+fm.width(optV4.text)+margin,
optV4.rect.y(),
margin+fm.width("Test Text"),
optV4.rect.height());
QMouseEvent* mouseEvent = dynamic_cast<QMouseEvent*>(event);
if( !actRect.contains( mouseEvent->pos()) ) {
btnState = QStyle::State_Raised;
return true;
}
if( event->type() == QEvent::MouseButtonPress) {
btnState = QStyle::State_Sunken;
} else if( event->type() == QEvent::MouseButtonRelease) {
btnState = QStyle::State_Raised;
}
return true;
}
Рабочий вариант программы по ссылке.