如果案例与现有项目不同,QComboBox将替换编辑文本

时间:2010-10-18 08:07:56

标签: python qt4 pyqt pyqt4 qcombobox

我遇到QComboBox的问题,不允许我更改编辑 文本到任何不同案例的现有项目。

示例代码如下。我想做的是将'one'输入组合中 已经包含项目'One'的框没有副作用 文本被更改为“一个”。目前,它已改回'One' 组合框失去焦点。

禁用AutoCompletionCaseSensitivity有效,但它有侧面 没有用的效果(例如,不显示'one'的完成)。

我也试过覆盖QComboBox的focusOutEvent和 恢复正确的文本,但然后复制粘贴之类的东西不会 工作。改变完成者也没有任何帮助。

事实组合框的行为方式对我的应用程序是有害的。如果 任何人有任何想法(或我错过了一些明显的东西),请让我 知道。

我在Ubuntu 10.04上使用Qt 4.6.2和PyQt 4.7.2但是有 在4.5以上的其他发行版/ Qt版本上体验过这一点。

谢谢和问候

示例代码:

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

1 个答案:

答案 0 :(得分: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_()

唯一的问题是它允许在组合框中添加重复项。 我尝试在if语句中添加self.findText(...),但是甚至Qt.MatchExactly | Qt.MatchCaseSensitive 会匹配“bla”,“bLa”和“BLA”。 我想你会发现的。