如何在Qt项目视图中为单个单元格设置委托?

10

在Qt的QAbstractItemView类中,可以使用setItemDelegate*方法将QAbstractItemDelegate(即QItemDelegateQStyledItemDelegate)设置为整个视图、单个行或单个列。此外,还可以使用QAbstractItemView::itemDelegate(const QModelIndex&)查询单个单元格的项代理,以及行、列和整个视图的代理。但是似乎没有办法将项代理设置到单个单元格。我有什么遗漏吗?这应该有什么原因吗?

3个回答

5

不,您不能仅为一个单元格或一列设置项目委托,但是您可以轻松地为整个窗口小部件设置项目委托,并选择要在哪个单元格、列或行中使用自定义绘画或其他内容。

例如:

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);
}

You can find some more information here


这是我第一次使用委托 - 如果我设置的委托是一个SpinBox,那么在您的方法中,编辑是否只会显示列1的SpinBox?SpinBox范围是否对其他列无效? - Matt Phillips
所有的更改只会影响到第一列,其他列将保持不变。 - Blood
1
好的,但是在这个方法中是否可以有多个特定于单元格的委托类型?你能在(0,2)处有一个微调框,在(3,1)处有一个进度条,并在其他所有地方使用默认委托吗? - Matt Phillips
我在我的回答中为您粘贴链接。所有内容都已经写好了。 - Blood
16
可以的,使用void QAbstractItemView::setItemDelegateForColumn ( int column, QAbstractItemDelegate * delegate )方法可以为单个列或单元格设置代理。 - Barath Ravikumar
显示剩余2条评论

2

我建议重新实现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;
}

你能演示一下如何在comboBox中使用吗? - JokerMartini

-1
自Qt 4.2以来,QAbstractItemView提供了setItemDelegateForColumn()和setItemDelegateForRow()方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接