Y a-t-il un moyen de déterminer si un Je vois comment obtenir l'article actuel et peut obtenir le délégué sur cet article, mais je ne vois aucun Quelqu'un peut-il me diriger dans la bonne direction? P> qtableview code> a un éditeur ouvert dans la cellule actuelle? J'ai besoin de gérer la situation suivante: p>
IseditMode () code> Propriété que j'espérais trouver. P>
6 Réponses :
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; }
Juste une note, je pense que vous voulez dire mutable i>, pas volatile i>.
@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.
Connectez-vous au signal de données de modèle sous-jacent
State QAbstractItemView::state () const
Vous pouvez sousclure Si vous avez déjà une sous-classe code> qstyleditemdelegate code>, vous pouvez l'utiliser pour suivre si un éditeur est actuellement ouvert. Cependant, vous ne pouvez pas simplement utiliser implémentation: p> à 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, malheureusement, qtableview code> afin de pouvoir accéder à la fonction
état () code>, qui est malheureusement protégée. Cependant, je n'ai pas essayé cela.
seditordata code> /
setmodeldata code>, car
setmodeldata code> 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. P>
m_editorcount code> doit être un entier au lieu d'un bool. P>
créeeeDitor () code> est une fonction
const code>. Par conséquent, vous ne pouvez pas créer un
int code> -Member. Au lieu de cela, créez un pointeur sur un
int code> et utilisez-le. P> p>
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.
Vérifiez simplement si la valeur de retour de est p>
Je ne suis pas sûr que si c'est sur cet état suffisant pour déterminer que c'est pour la cellule actuelle B>
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);
Si vous connaissez l'index de l'article édité, vous pouvez appeler indexwidget () code> 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.