Как установить делегат для одной ячейки в представлении элемента Qt?

довольно озадачен этим упущением-но в Qt QAbstractItemView класс, можно установить QAbstractItemDelegate (т. е. QItemDelegate или QStyledItemDelegate) для всего представления, одной строки или одного столбца, используя setItemDelegate* методы. Кроме того, делегат элемента для отдельной ячейки может быть запрошен с помощью QAbstractItemView::itemDelegate(const QModelIndex&), вместе с делегатом для строк, столбцов. и весь вид. Но, похоже, нет. способ set делегат элемента в отдельную ячейку. Я что-то упускаю? По какой причине это должно быть?

2 ответов


нет вы не можете установить делегат элемента только для одной ячейки или одного столбца, но вы можете легко установить делегат элемента для всего виджета и выбрать, в какой ячейке, столбце или строке вы хотите использовать свою пользовательскую картину или что-то еще.

, например,

void WidgetDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                       const QModelIndex &index) const
{
    if (index.column() == 1) 
    {
        // ohh it's my column
        // better do something creative
    } 
    else // it's just a common column. Live it in default way
        QItemDelegate::paint(painter, option, index);
}

вы можете найти более подробную информацию здесь


Я бы рекомендовал вместо этого переопределить функцию createEditor:

QWidget * WidgetDelegate::createEditor(
        QWidget *parent,
        const QStyleOptionViewItem &,
        const QModelIndex &index) const
{
    QWidget *widget = 0;
    if (index.isValid() && index.column() < factories.size())
    {
        widget = factories[index.column()]->createEditor(index.data(Qt::EditRole).userType(), parent);
        if (widget)
            widget->setFocusPolicy(Qt::WheelFocus);
    }
    return widget;
}