2010-10-18 13 views
1

J'ai un problème avec QComboBox ne me permettant pas de changer le texte d'édition à quelque chose existant de cas différent.QComboBox remplacer le texte d'édition si le cas diffère de l'élément existant

Exemple de code est ci-dessous. Qu'est-ce que je voudrais faire est d'entrer «un» dans une boîte combo contenant déjà l'élément «One» sans l'effet secondaire du texte étant changé en «One». Actuellement, il est à nouveau défini sur 'One' sous la forme dès que la zone de liste déroulante perd son focus.

La désactivation de AutoCompletionCaseSensitivity fonctionne, mais elle a l'effet de ne pas être utile (par exemple, ne pas afficher les finitions pour 'one').

J'ai également essayé de remplacer le focusOutEvent de QComboBox et restaurer le texte correct, mais des choses comme copier-coller ne fonctionnent pas . Changer le completer n'a pas aidé non plus.

Le fait que les boîtes combo se comportent de cette façon est préjudiciable à mon application. Si quelqu'un a des idées (ou j'ai manqué quelque chose d'évident), s'il vous plaît laissez-moi savoir . J'utilise Qt 4.6.2 et PyQt 4.7.2 sur Ubuntu 10.04, mais j'ai l'ai expérimenté sur d'autres versions de distributions/Qt au dessus de 4.5.

Merci et salutations

Exemple de code:

from PyQt4.QtGui import * 
from PyQt4.QtCore import SIGNAL, Qt 

class Widget(QWidget): 
    def __init__(self, parent=None): 
     super(Widget, self).__init__(parent) 
     combo = QComboBox() 
     combo.setEditable(True) 
     combo.addItems(['One', 'Two', 'Three']) 
     lineedit = QLineEdit() 

     layout = QVBoxLayout() 
     layout.addWidget(combo) 
     layout.addWidget(lineedit) 
     self.setLayout(layout) 

app = QApplication([]) 
widget = Widget() 
widget.show() 
app.exec_() 

Répondre

1
from PyQt4.QtGui import * 
from PyQt4.QtCore import SIGNAL, Qt, QEvent 


class MyComboBox(QComboBox): 
    def __init__(self): 
     QComboBox.__init__(self) 

    def event(self, event): 
     if event.type() == QEvent.KeyPress and event.key() == Qt.Key_Return: 
      self.addItem(self.currentText()) 

     return QComboBox.event(self, event) 

class Widget(QWidget): 
    def __init__(self, parent=None): 
     super(Widget, self).__init__(parent) 
     combo = MyComboBox() 
     combo.setEditable(True) 
     combo.addItems(['One', 'Two', 'Three']) 
     lineedit = QLineEdit() 

     layout = QVBoxLayout() 
     layout.addWidget(combo) 
     layout.addWidget(lineedit) 
     self.setLayout(layout) 

app = QApplication([]) 
widget = Widget() 
widget.show() 
app.exec_() 

Le seul problème est qu'il permettra d'ajouter des doublons à votre combobox. J'ai essayé d'ajouter un self.findText (...) à l'instruction if mais même Qt.MatchExactly | Qt.MatchCaseSensitive correspondrait à "bla", "bLa" et "BLA". Je suppose que vous le découvrirez.

+0

Merci, mais cela n'aide pas beaucoup. Il ne répond pas à l'utilisateur en appuyant sur Tab ou en cliquant sur un autre widget. – concentricpuddle