9
votes

Déterminer si qtableview a un éditeur ouvert

Y a-t-il un moyen de déterminer si un qtableview a un éditeur ouvert dans la cellule actuelle? J'ai besoin de gérer la situation suivante:

  • Un utilisateur double-clique sur une cellule et édite les données, mais laisse la cellule dans l'état "Modifier" . .
  • sur une autre partie de l'interface utilisateur, une action est prise qui change la ligne sélectionnée du modèle sous-jacent.
  • Retour à mon avis, je tiens à déterminer si la ligne nouvellement sélectionnée est la même que la ligne ouverte. Sinon, je dois prendre une action. (Invite l'utilisateur? S'engager automatiquement? Revert?)

    Je vois comment obtenir l'article actuel et peut obtenir le délégué sur cet article, mais je ne vois aucun IseditMode () Propriété que j'espérais trouver.

    Quelqu'un peut-il me diriger dans la bonne direction?


0 commentaires

6 Réponses :


2
votes

Sous-classe Votre délégué de manière à ce qu'il inclue un accesseur qui vous indique lors de l'édition:

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; }


3 commentaires

Juste une note, je pense que vous voulez dire mutable , pas volatile .


@Caleb - Tu as raison. Changé - et merci de pointer cela.


Comme cela a déjà souligné par Florian Kusche dans sa réponse, cela ne fonctionne pas car SetModelData () n'est appelé que si l'édition est commise, mais pas si elle est annulée.



3
votes

Connectez-vous au signal de données de modèle sous-jacent

State QAbstractItemView::state () const


0 commentaires

3
votes

Vous pouvez sousclure qtableview afin de pouvoir accéder à la fonction état () , qui est malheureusement protégée. Cependant, je n'ai pas essayé cela.

Si vous avez déjà une sous-classe qstyleditemdelegate , vous pouvez l'utiliser pour suivre si un éditeur est actuellement ouvert. Cependant, vous ne pouvez pas simplement utiliser seditordata / setmodeldata , car setmodeldata ne sera pas appelé, lorsque l'utilisateur annule la modification. Au lieu de cela, vous pouvez suivre la création et la destruction de l'éditeur lui-même. xxx

implémentation: xxx

à quelques occasions, par exemple Lorsque vous passez à l'élément suivant de l'arborescence à l'aide des touches de curseur, QT créera d'abord le nouvel éditeur, puis détruisez l'ancien. Par conséquent, m_editorcount doit être un entier au lieu d'un bool.

malheureusement, créeeeDitor () est une fonction const . Par conséquent, vous ne pouvez pas créer un int -Member. Au lieu de cela, créez un pointeur sur un int et utilisez-le.


2 commentaires

Joli. Juste quelques commentaires: meilleure utilisation mutable int au lieu de INT *. En outre, aucune nécessité de réimplément SetDITORDATA () et SetModelData () dans votre solution fournie, vous auriez donc eu des omises pour plus de clarté.


Oui tu as raison. Les INT mutables seraient un peu mieux.



10
votes

Vérifiez simplement si la valeur de retour de xxx

est xxx


1 commentaires

Je ne suis pas sûr que si c'est sur cet état suffisant pour déterminer que c'est pour la cellule actuelle



0
votes

Voici une idée, c'est même utile pour obtenir le widget édition / combo avant que l'édition commence ...

Il suffit d'émettre un signal et de le consommer dans le MainWindow ... C'est ce que j'avais utilisé pour obtenir un combo Boîte dans QTableWidget avant d'éditer ... p>

Créez d'abord un signal dans ComoboxitemDelegate ... P>

ComboBoxItemDelegate* cbid = new ComboBoxItemDelegate(ui->tableWidget);
connect(cbid, &ComboBoxItemDelegate::OnComboEdit, this, &MainWindow::OnComboEidt);
ui->tableWidget->setItemDelegateForColumn(0, cbid);


0 commentaires

1
votes

Si vous connaissez l'index de l'article édité, vous pouvez appeler indexwidget () et tenter de le jeter. Si c'est valide, vous ne savez pas seulement que vous modifiez, mais vous avez également votre widget d'éditeur pratique. XXX


0 commentaires