I solved changing approach; I'm not using anymore _state member but int _currRow to track clicked button; here it is a sample code:

Qt Code:
  1. ItemDelegate::ItemDelegate(QObject *parent) :
  2. {
  3. _currRow = -1;
  4. }
  5.  
  6. void ItemDelegate::paint ( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const
  7. {
  8. if (!index.isValid())
  9. return;
  10.  
  11. QApplication::style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, painter, 0);
  12.  
  13. ...
  14.  
  15. button.rect = buttonRect;
  16. button.features |= QStyleOptionButton::Flat;
  17.  
  18. if(_currRow == index.row())
  19. button.state = QStyle::State_Sunken | QStyle::State_Enabled;
  20. else
  21. button.state = QStyle::State_Raised | QStyle::State_Enabled;
  22.  
  23. QApplication::style()->drawControl(QStyle::CE_PushButton, &button, painter);
  24. }
  25.  
  26. bool ItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
  27. {
  28. Q_UNUSED(model)
  29.  
  30. if( event->type() != QEvent::MouseButtonPress &&
  31. event->type() != QEvent::MouseButtonRelease ) {
  32. return true;
  33. }
  34.  
  35. if( event->type() == QEvent::MouseButtonPress)
  36. _currRow = index.row();
  37. else
  38. _currRow = -1;
  39.  
  40. ...
  41.  
  42. QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
  43. if( !buttonRect.contains( mouseEvent->pos()) ) {
  44. return true;
  45. }
  46.  
  47. if( event->type() == QEvent::MouseButtonRelease) {
  48. // call slot
  49. }
  50.  
  51. return true;
  52. }
To copy to clipboard, switch view to plain text mode 

Thanks ChrisW67 for your time.