9

QTableView現在のセルで開いているエディターがあるかどうかを判断する方法はありますか? 次の状況を処理する必要があります。

  • ユーザーがセルをダブルクリックしてデータを編集しますが、セルは「編集」状態のままです。
  • UI の別の部分で、基になるモデルの選択された行を変更するアクションが実行されます。
  • ビューに戻って、新しく選択した行が開いている行と同じかどうかを判断したいと思います。そうでない場合は、アクションを実行する必要があります。(ユーザーにプロンプ​​トを表示しますか? 自動的にコミットしますか? 元に戻しますか?)

現在のアイテムを取得する方法がわかり、そのアイテムのデリゲートを取得できますが、isEditMode()見つけたいと思っていたプロパティが表示されません。

誰かが私を正しい方向に向けることができますか?

4

6 に答える 6

10

の戻り値かどうかを確認するだけです

State QAbstractItemView::state () const

QTableView::EditingState
于 2014-03-13T14:04:16.873 に答える
3

基礎となるモデル dataChange シグナルに接続する

void QAbstractItemModel::dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight )

データが変更されたセルがcurrentIndexと同じかどうかを確認できます

QModelIndex QAbstractItemView::currentIndex () const

現在のセルにエディターが開いているかどうかはわかりませんが、ビューが QAbstractItemView::EditingState にあるかどうかを確認できます

State QAbstractItemView::state () const

あなたがやりたいことをするだけで十分なはずです。

于 2012-12-11T10:32:14.787 に答える
3

残念ながら保護されている関数QTableViewにアクセスできるようにするためにサブクラス化できます。state()しかし、私はそれを試しませんでした。

既にQStyledItemDelegateサブクラスがある場合は、それを使用して、エディターが現在開いているかどうかを追跡できます。ただし、ユーザーが編集をキャンセルしたときに呼び出されないため、setEditorData/だけを使用することはできません。代わりに、エディター自体の作成と破棄を追跡できます。setModelDatasetModelData

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_editorCountbool ではなく整数でなければなりません。

残念ながら、createEditor()関数constです。intしたがって、 -memberを作成することはできません。代わりに、へのポインタを作成してint使用します。

于 2013-08-29T12:01:02.407 に答える
2

デリゲートをサブクラス化して、編集時に通知するアクセサーが含まれるようにします。

void MyDelegate::setEditorData ( QWidget * editor, const QModelIndex & index ) const {
    // _isEditing  will have to be mutable because this method is const
    _isEditing = true; 
    QStyledItemDelegate::setEditorData(editor, index);
}

void MyDelegate::setModelData ( QWidget * editor, QAbstractItemModel * model, const QModelIndex & index ) const {
    QStyledItemDelegate::setModelData(editor, model, index);
    _isEditing = false;
}

bool MyDelegate::isEditing() const { return _isEditing; }

次に、デリゲートをチェックして、何が起こっているかを確認できます。または、および/またはが気に入らない場合はmutable、シグナルを送信して、デリゲートがどのような状態にあるかを知ることができます。

于 2010-08-06T20:52:59.460 に答える
1

編集中のアイテムのインデックスがわかっている場合は、それを呼び出しindexWidget()てキャストを試みることができます。有効であれば、編集中であることがわかるだけでなく、エディター ウィジェットも便利です。

EditWidget *editWidget = qobject_cast<EditWidget*>(tableView->indexWidget(tableView->currentIndex()));
if(editWidget)
{
    //yep, ur editing bro
}
于 2016-12-31T08:45:45.497 に答える
0

ここにアイデアがあります。編集が始まる前に編集/コンボウィジェットを取得するとさらに役立ちます...

シグナルを発行してメインウィンドウで消費するだけです...これは、編集前にQTableWidgetでコンボボックスを取得するために使用したものです...

最初に ComoBoxItemDelegate でシグナルを作成します...

signals:
   void OnComboEdit(QComboBox* pCombo) const;

次に、 createEditor メソッドでシグナルを発行します...

QWidget* ComboBoxItemDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    // Create the combobox and populate it
    QComboBox* cb = new QComboBox(parent);
    emit OnComboEdit(cb);
    return cb;
}

MainWindow で、信号を受け取る関数を宣言します...

void MainWindow::OnComboEidt(QComboBox *pCB) const
{
    qDebug() << "Combo Eidt Singal Received";
}

最後に MainWindow のコンストラクターで接続します...

ComboBoxItemDelegate* cbid = new ComboBoxItemDelegate(ui->tableWidget);
connect(cbid, &ComboBoxItemDelegate::OnComboEdit, this, &MainWindow::OnComboEidt);
ui->tableWidget->setItemDelegateForColumn(0, cbid);
于 2016-09-08T03:34:50.373 に答える