PDA

View Full Version : QAbstractItemDelegate, editorEvent, CE_PushButton and item selection



cydside
7th August 2013, 17:27
Hi to all,
I'm having a problem with selection of an delegated item which represents two text lines and a CE_PushButton. I want to have the row selected by clicking the button too. Here is my paint function code:


void ColumnTwoLinesDelegate::paint(
QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index
) const
{
if (!index.isValid())
return;

if (option.state & QStyle::State_Selected)
{
painter->setPen(QPen(Qt::white));

if (option.state & QStyle::State_Active)
{
painter->setBrush(QBrush(QPalette().highlight()));
}
else
{
painter->setBrush(QBrush(QPalette().color(QPalette::Inactiv e, QPalette::Highlight)));
}

painter->drawRect(option.rect);
}
else
{
painter->setPen(QPen(Qt::black));
}

QApplication::style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, painter, 0);

// ...it draws two text lines.

painter->restore();

QRect tButtonRect;
tButtonRect.setX(option.rect.width() - kHorizzontalMarginSize);
tButtonRect.setY(option.rect.y() + (option.rect.height() / 2 - kButtonSize / 2));
tButtonRect.setWidth(kButtonSize);
tButtonRect.setHeight(kButtonSize);

QStyleOptionButton tButton;

if (index.model()->data(index.model()->index(index.row(), 5)).toInt() == 1)
{
tButton.icon = mArchive;
}
else
{
tButton.icon = mReActive;
}

tButton.iconSize = QSize(kButtonSize - 2, kButtonSize - 2);
tButton.rect = tButtonRect;

tButton.features |= QStyleOptionButton::Flat;

if (mCurrentRow == index.row())
{
tButton.state = QStyle::State_Sunken | QStyle::State_Enabled;
}
else
{
tButton.state = QStyle::State_Raised | QStyle::State_Enabled;
}

QApplication::style()->drawControl(QStyle::CE_PushButton, &tButton, painter);
}


and the editorEvent function code:



bool ColumnTwoLinesDelegate::editorEvent(
QEvent *event,
QAbstractItemModel *model,
const QStyleOptionViewItem &option,
const QModelIndex &index)
{
Q_UNUSED(model);

if (event->type() != QEvent::MouseButtonPress
&& event->type() != QEvent::MouseButtonRelease)
{
return true;
}

// this rect represents a pushbutton
QRect tButtonRect;
tButtonRect.setX(option.rect.width() - kHorizzontalMarginSize);
tButtonRect.setY(option.rect.y() + (option.rect.height() / 2 - kButtonSize / 2));
tButtonRect.setWidth(kButtonSize);
tButtonRect.setHeight(kButtonSize);

QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);

// if mouse position is outside button rect/button area we use a State_Raised style
if (!tButtonRect.contains(mouseEvent->pos()))
{
// it allows the row's selection
return false;
}

if (event->type() == QEvent::MouseButtonPress)
{
mCurrentRow = index.row();
}
else if (event->type() == QEvent::MouseButtonRelease)
{
mCurrentRow = -1;

// when MouseButtonRelease emit a signal like clicked()
emit documentRequest(index);
}

return true;
}


only returning false allows the row selection, but I'd like to obtain the same behavior by clicking the button, is it possible?
Thanks in advance, Danilo