QTextEdit et limitation de saisie / validation d'entrées
Bonjour, je souhaite utiliser un QtextEdit dont je limiterai la saisie au clavier aux lettres atgc (pour l'ADN, je suis biologiste...). J'ai vu qu'il n'existe rien de semblable au Qvalidator de QlineEdit pour QtextEdit.
La seule info que j'ai trouvée est ce post mais la solution ne me plait pas car en désactivant l'édition du QtextEdit, je perds les bindings de navigation avec les touches....
Dans le processus de traitement des événements clavier par défaut du Qtextedit, n 'y a t il pas une méthode genre "insert..." qui soit appellée lors d'un evenement clavier que je puisse surcharger pour "nettoyer" tout caractère différent de 'a', 't', 'g' ou 'c' histoire de "limiter la saisie" de mon QtextEdit?
Une idée pour m'aider?
Une méthode avec les evnts
Finalement voici ce qu'il faut faire pour respecter la position du curseur en utilisant keyPressEvent. :yaisse3:
L'avantage de cette méthode est d'éviter de parcourir tout le texte ce qui peut ralentir l'exécution du code (bien que je doute qu'en pratique cela soit perceptible dans le cadre de ton application).
Code fonctionnelle de l'interface graphique keyEventForm_Plus.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| # -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
class textPlus(QtGui.QTextEdit):
def keyPressEvent(self, event):
# On redéfinie la méthode keyPressEvent pour
# n'accepter que certaines touches du clavier.
# Cas des touches attendues.
if event.key() in (QtCore.Qt.Key_G, QtCore.Qt.Key_C, QtCore.Qt.Key_T, QtCore.Qt.Key_A):
curseur=self.textCursor()
curseur.insertText(chr(event.key()))
# Cas des déplacements à l'aide du clavier.
elif event.key() == QtCore.Qt.Key_Left:
self.moveCursor(QtGui.QTextCursor.PreviousCharacter)
elif event.key() == QtCore.Qt.Key_Right:
self.moveCursor(QtGui.QTextCursor.NextCharacter)
elif event.key() == QtCore.Qt.Key_End:
self.moveCursor(QtGui.QTextCursor.End)
elif event.key() == QtCore.Qt.Key_Backtab:
self.moveCursor(QtGui.QTextCursor.Start)
# Deux trucs trouvés dans le livre « Rapid GUI Programming
# with Python and Qt » de Mark SUMMERFIELD.
# TRUC 1 : Gérér une séquence comme CTRL + TAB.
# elif event.key() == QtCore.Qt.Key_Tab:
# if event.modifiers() and QtCore.Qt.ControlModifier:
# print 'CTRL + TAB'
# TRUC 2 : Pour accepter toutes les autres actions.
# else:
# QtGui.QTextEdit.keyPressEvent(self, event)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(395, 292)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.textEdit = textPlus()
self.textEdit.setObjectName("textEdit")
self.verticalLayout.addWidget(self.textEdit)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 395, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_()) |