9
votes

Implémentation d'annulation - Fonctionnalité Redo à Qt?

Mon programme se compose de multiples QLineEdit 'est dans mon QMainWindow . L'utilisateur peut modifier le texte dans un QLineEdit . Actuellement, je peux effectuer Redo par l'implémentation par défaut pour chaque QLineEdit lorsque le correspondant QLineEdit est sélectionné. Cependant, je veux ajouter des fonctionnalités de sorte que lorsque mon undo * redo * boutons sont pressés puis, en conséquence la modification QLineEdit effectue Undo / Redo . à savoir dire L1, L2, etc sont mes QLineEdit 's. Ensuite, les opérations suivantes sont effectuées par l'utilisateur: 1. L2-> texte ajouté ... 5. L5-> texte ajouté ... 9. L3-> texte supprimé 10. L5-> Annuler (en sélectionnant L5 et ensuite "ctrl + z")

Maintenant, lorsque l'utilisateur appuie sur Undo / Redo bouton comme suit: 1. Annuler -> doit annuler l'annulation effectuée à l'étape 10 2. Annuler -> le texte annulez-supprimé à l'étape 9 3. Redo -> doit refaire le texte supprimé à l'étape 9 4. Annuler -> devrait annuler l'opération effectuée par l'étape 8

À l'heure actuelle, je peux penser vaguement d'un mécanisme de l'histoire, mais caracole en tête, il sera assez fastidieux. Je voudrais donc savoir si Qt me fournit une fonctionnalité intégrée pour ce faire? Merci.


0 commentaires

3 Réponses :


16
votes

QT fournit un Annuler / Redo framework.

Vous implémentez fondamentalement une commande, dérivée de Qundocommand , pour chacune des actions que vous souhaitez apporter un / redoutable, puis les pousser à un < Code> Qundostack . Plus tard, les commandes peuvent être annulées et refaites en appelant les emplacements correspondants sur le Qundostack .

Notez que, lorsque vous appuyez sur une commande sur la pile, il est automatiquement refaire , signifie exécuté pour la première fois. Parfois, ce n'est pas ce que vous voulez, car la commande pourrait déjà avoir déjà été exécutée - vous auriez besoin de considérer cela dans la mise en œuvre de vos commandes.


1 commentaires

Merci pour la réponse et vos entrées sur le sujet!



3
votes

Un moyen d'implémenter cela consiste à utiliser le modèle 'Commande'. QT fournit un cadre d'annulation qui suit ce modèle: http://qt-project.org/doc/qt-4.8/tools -undoframework.html

Pour faciliter cela, vous devrez peut-être apporter des modifications à votre programme pour en faire un peu plus MVC (contrôleur de vue modélisateur). Vous auriez un modèle de données qui représente le contenu de votre formulaire. La forme elle-même est la vue et le contrôleur - Toute modification des modifications de ligne effectuées par l'utilisateur mettrait à jour le modèle de données. Le modèle de données mettrait en œuvre des modifications à l'utilisation de Qundocommands qui sont poussés sur un qundostack à partir du cadre d'annulation QT. Lorsque l'état du modèle change (en raison d'un annulation / de redo), l'interface utilisateur répondrait à la modification et être mise à jour pour refléter l'état du modèle.


3 commentaires

Merci pour votre réponse. Je vais examiner cela. Mais je ne comprends pas exactement ce que vous entendez par MVC. Est-ce un concept Qt ou d'une programmation générale?


MVC est un concept de programmation général. Les parties de la vue et du contrôleur sont quelque peu couplées ici - comme c'est souvent le cas dans les programmes d'interface graphique. Essentiellement, pensez-y simplement comme séparant les données de l'interface utilisateur. L'UI affiche et contrôle les données.


Vous devez également vous assurer que Ctrl-ZC etc est dirigé par vos actions annulaires / Redo plutôt que par le biais de QLineDIT afin de tout wok correctement.



1
votes

QT a des cours pour aider à annuler, voir Qundostack . Chaque étape annulable doit être mise en œuvre comme une sous-classe de Qundocommand .

Ce que vous essayez d'atteindre n'est pas simple, car vous aurez besoin de contourner les piles internes d'annulation de votre qLineDit s. Voici une suggestion: écoutez le signal focalchanged de qapplication . Si l'une de vos modifications de la ligne a Coin Store, il s'agit de contenu et de vous connecter au QLineDit :: Modifier () signal. Lorsque cela est reçu, mettez une commande sur la pile avec l'ancien et le nouveau texte. La faille de cette approche est que vous ne captiez pas de capturer les modifications intermédiaires dans un seul QLineDit . Par exemple, si vous vouliez stocker 1) l'utilisateur en sélectionnant du texte et frapper Supprimer, alors 2) en tapant un nouveau texte, comme des étapes distinctes supplémentaires, vous devrez peut-être commencer à filtrer les événements clés et que la logique peut être complexe. Mais c'est l'approche générale.


1 commentaires

Merci pour votre réponse et aussi pour vos suggestions. Je vais regarder et revenir à vous s'il y a un problème.