我有一个QTableView和自制委托在其单元格内显示图像。 要将委托连接到某个列,我使用:
ui->tableViewQueryResult->setItemDelegateForColumn(ui->lineEditPicColumn->text().toInt() - 1, new ImageDelegate());
是否可以断开以前连接的所有代表?我试过了
ui->tableViewQueryResult->setItemDelegate(NULL);
但是这会在运行时崩溃程序。
答案 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);
}