QTableView 断开所有委托

QTableView disconnect all delegates

我有一个 QTableView 和自制委托来显示其单元格内的图像。 要将委托连接到某个列,我使用这个:

ui->tableViewQueryResult->setItemDelegateForColumn(ui->lineEditPicColumn->text().toInt() - 1, new ImageDelegate());

是否可以断开所有之前连接的代表?我试过了

ui->tableViewQueryResult->setItemDelegate(NULL);

但这会使程序在运行时崩溃。

来自 setItemDelegate() 的 Qt 文档:

Any existing delegate will be removed, but not deleted. QAbstractItemView does not take ownership of delegate.

您需要做的是,对于您正在自定义的每个列委托,首先(在某处)记住旧委托并最终恢复它。您还需要删除未使用的委托。 *View 不会为您做这件事,因为它不拥有委托的所有权。

因此您还需要使用 setColumnDelegate()。如果您为列设置委托,则必须为列恢复它,而不是为所有项目恢复它。

操作方法如下:

class Aaaa
{
    QHash<int,QAbstractItemDelegate*> delegateForColumn; // <- keep this in class members;
}

然后:

void Aaaa::setMyDelegate()
{
    // Getting column to set on
    int column = ui->lineEditPicColumn->text().toInt() - 1;

    // Remembering old delegate
    delegateForColumn[column] = ui->tableViewQueryResult->columnDelegate(column);

    // Setting new delegate
    ui->tableViewQueryResult->setColumnDelegate(column, new ImageDelegate());
}

void Aaaa::unsetMyDelegate()
{
    // Getting column to reset delegate for
    int column = ui->lineEditPicColumn->text().toInt() - 1;

    // Getting current delegate for column, keeping it in local variable, cause we will need to delete it later on
    QAbstractItemDelegate* old = ui->tableViewQueryResult->columnDelegate(column);

    // Setting new delegate (the initial one) to the column
    ui->tableViewQueryResult->setColumnDelegate(column, delegateForColumn[column]);

    // Deleting our custom delegate, cause we don't need it anymore
    delete old;

    // Removing custom delegate from our registry - a cleanup
    delegateForColumn.remove(column);
}