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)


arrow_upward
1
arrow_downward

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