Вы можете создать подкласс QTableView
для доступа к функции state()
, которая, к сожалению, защищена. Однако я этого не пробовал.
Если у вас уже есть подкласс QStyledItemDelegate
, вы можете использовать его для отслеживания того, открыт ли редактор в данный момент. Однако вы не можете просто использовать setEditorData
/ setModelData
, потому что setModelData
не будет вызываться, когда пользователь отменяет редактирование. Вместо этого вы можете отслеживать создание и уничтожение самого редактора.
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 );
};
Реализация:
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)--;
}
В некоторых случаях, например, при переходе к следующему элементу в дереве с помощью клавиш курсора, Qt сначала создаст новый редактор, а затем уничтожит старый. Следовательно, m_editorCount
должно быть целым числом вместо bool.
К сожалению, createEditor()
- это функция const
. Следовательно, вы не можете создать int
-члена. Вместо этого создайте указатель на int
и используйте его.