QTableView断开所有代理

时间:2015-05-20 10:43:10

标签: qt qtableview

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

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

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

ui->tableViewQueryResult->setItemDelegate(NULL);

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

1 个答案:

答案 0 :(得分:0)

来自setItemDelegate()的Qt文档:

  

任何现有的委托都将被删除,但不会被删除。   QAbstractItemView不接受委托的所有权。

您需要做的是为您自定义的每个列委托,首先记住(某处)旧委托并最终恢复它。您还需要删除未使用的代理。 * 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);
}