Добрый день, извините за паузу - праздники )))
Действительно, дело было в ролях. Было так:
QVariant message_model::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();
    if (role != Qt::DisplayRole && role != Qt::DecorationRole)
        return QVariant();		
	  
	message_model_item *item = getItem(index);
    return item->data(index.column());
}
Т.е. для колонки, где должна быть только иконка независимо от роли я отдавал данные.
Теперь так:
QVariant message_model::data(const QModelIndex &index, int role) const
{
   if (!index.isValid())
        return QVariant();
    if (role != Qt::DisplayRole && role != Qt::DecorationRole)
        return QVariant();
	int col = index.column();
	if(role == Qt::DisplayRole && (col == 1 || col == 2))
		return QVariant();
	else if(role == Qt::DecorationRole && (col == 0 || col == 3))
		return QVariant();
	  
	message_model_item *item = getItem(index);
    return item->data(col);
}
Для текстовых колонок отдаю данные только для роли DisplayRole, а для колонок с иконками -  только для DecorationRole
Спасибо 
Константин, направил в нужном направлении
Модераторам: тему можно закрывать или удалять - на ваше усмотрение )