残念ながら保護されている関数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
したがって、 -memberを作成することはできません。代わりに、へのポインタを作成してint
使用します。