Puede subclase QTableView
para poder acceder a la función state()
, que desafortunadamente está protegida. Sin embargo, no intenté eso.
Si ya tiene una subclase QStyledItemDelegate
, puede usarla para rastrear si un editor está actualmente abierto. Sin embargo, no puede usar setEditorData
/setModelData
, porque setModelData
no se invocará cuando el usuario cancele la edición. En cambio, puede rastrear la creación y destrucción del editor en sí.
class MyItemDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
MyItemDelegate(QObject* parent = nullptr);
~MyItemDelegate();
QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const;
void setEditorData(QWidget* editor, const QModelIndex& index) const;
void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const;
bool isEditorOpen() const { return *m_editorCount > 0; }
protected:
int* m_editorCount;
protected slots:
void onEditorDestroyed(QObject* obj);
};
Implementación:
MyItemDelegate::MyItemDelegate(QObject* parent) :
QStyledItemDelegate(parent)
{
m_editorCount = new int;
*m_editorCount = 0;
}
MyItemDelegate::~MyItemDelegate()
{
delete m_editorCount;
}
QWidget* MyItemDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
// create an editor, can be changed as needed
QWidget* editor = QStyledItemDelegate::createEditor(parent, option, index);
connect(editor, SIGNAL(destroyed(QObject*)), SLOT(onEditorDestroyed(QObject*)));
printf("editor %p created\n", (void*) editor);
(*m_editorCount)++;
return editor;
}
void MyItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
...
}
void MyItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
...
}
void MyItemDelegate::onEditorDestroyed(QObject* obj)
{
printf("editor %p destroyed\n", (void*) obj);
(*m_editorCount)--;
}
En algunas ocasiones, por ejemplo, cuando se mueve al siguiente elemento en el árbol usando las teclas del cursor, Qt creará primero el nuevo editor y luego destruirá el anterior. Por lo tanto, m_editorCount
debe ser un número entero en lugar de un bool.
Desafortunadamente, createEditor()
es una función const
.Por lo tanto, no puede crear un int
-miembro. En su lugar, cree un puntero a un int
y úselo.
Solo una nota, creo que se refería a * mutable *, not * volátil *. –
@Caleb - Tienes razón. Cambiado, y gracias por señalarlo. –
Como ya señaló Florian Kusche en su respuesta, esto no funciona porque setModelData() solo se invoca si la edición está confirmada, pero no si se cancela. – emkey08