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);
}
我有一个 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);
}