Mon programme se compose de multiples 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 p>
À 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. P> QLineEdit code> 'est dans mon QMainWindow code>. L'utilisateur peut modifier le texte dans un QLineEdit code>. Actuellement, je peux effectuer Redo em> par l'implémentation par défaut pour chaque QLineEdit code> lorsque le correspondant QLineEdit code> est sélectionné. Cependant, je veux ajouter des fonctionnalités de sorte que lorsque mon undo em> * redo * boutons sont pressés puis, en conséquence la modification QLineEdit code> effectue Undo / Redo em>. à savoir dire L1, L2, etc sont mes QLineEdit code> '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") p>
3 Réponses :
QT fournit un Annuler / Redo framework. P>
Vous implémentez fondamentalement une commande, dérivée de Notez que, lorsque vous appuyez sur une commande sur la pile, il est automatiquement refaire em>, 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. P> Qundocommand code> a >, pour chacune des actions que vous souhaitez apporter un / redoutable, puis les pousser à un < Code> Qundostack Code> . Plus tard, les commandes peuvent être annulées et refaites en appelant les emplacements correspondants sur le Qundostack code>. P>
Merci pour la réponse et vos entrées sur le sujet!
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 p>
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. P>
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.
QT a des cours pour aider à annuler, voir Ce que vous essayez d'atteindre n'est pas simple, car vous aurez besoin de contourner les piles internes d'annulation de votre Qundostack code>. Chaque étape annulable doit être mise en œuvre comme une sous-classe de Qundocommand code>. P>
qLineDit code> s. Voici une suggestion: écoutez le signal focalchanged code> de qapplication code>. Si l'une de vos modifications de la ligne a Coin Store, il s'agit de contenu et de vous connecter au QLineDit :: Modifier () code> 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 code>. 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. P>
Merci pour votre réponse et aussi pour vos suggestions. Je vais regarder et revenir à vous s'il y a un problème.