QComboBox заменяет текст редактирования, если регистр отличается от существующего элемента

У меня проблема с QComboBox, который не позволяет мне изменить текст редактирования на какой-либо существующий элемент другого регистра.

Пример кода ниже. Что я хотел бы сделать, так это ввести «один» в поле со списком, уже содержащее элемент «Один», без побочного эффекта изменения текста на «Один». В настоящее время он снова меняется на «Один», как только поле со списком теряет фокус.

Отключение AutoCompletionCaseSensitivity работает, но имеет побочный эффект бесполезности (например, не показывает завершения для «один»).

Я также пытался переопределить focusOutEvent QComboBox и восстановить правильный текст, но тогда такие вещи, как копирование-вставка, не работают. Замена комплектующего тоже не помогла.

Тот факт, что поля со списком ведут себя таким образом, вреден для моего приложения. Если у кого-то есть какие-либо идеи (или я пропустил что-то очевидное), пожалуйста, дайте мне знать.

Я использую Qt 4.6.2 и PyQt 4.7.2 в Ubuntu 10.04, но сталкивался с этим в других дистрибутивах/версиях Qt выше 4.5.

Спасибо и с уважением

Пример кода:

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_()

person concentricpuddle    schedule 18.10.2010    source источник


Ответы (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_()

Единственная проблема заключается в том, что это позволит добавлять дубликаты в поле со списком. Я попытался добавить self.findText(...) в оператор if, но даже Qt.MatchExactly | Qt.MatchCaseSensitive будет соответствовать "bla", "bLa" и "BLA". Думаю, ты узнаешь.

person aukaost    schedule 18.10.2010
comment
Спасибо, но это мало помогает. Это не обслуживает пользователя, нажимающего Tab или щелкающего по любому другому виджету. - person concentricpuddle; 20.10.2010