首页 文章

模型/视图QLineEdit中的QCompleter

提问于
浏览
2

ubuntu 10.04,KDE 4.4.5

python 2.6.4

qt 4.6.2

pyqt 4.6.2

我正在尝试创建一个QCompleter,如果我只是构建QLineEdit,它可以正常工作 . 但是,如果我将QLineEdit放入QMainWindow,QCompleter将不再起作用 .

这是LineEdit类

# LineEdit class
import sys
from PyQt4 import QtCore, QtGui

class LineEdit(QtGui.QLineEdit):
    def __init__(self, parent=None):
        super(LineEdit, self).__init__(parent)

        self.setFocusPolicy(QtCore.Qt.StrongFocus)

        self.completer = QtGui.QCompleter(self)
        self.completer.setCompletionMode(QtGui.QCompleter.UnfilteredPopupCompletion)
        self.pFilterModel = QtGui.QSortFilterProxyModel(self)
        self.pFilterModel.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive)
        self.completer.setPopup(self.view())
        self.setCompleter(self.completer)
        self.textEdited[unicode].connect(self.pFilterModel.setFilterFixedString)

    def setModel(self, model):
        self.pFilterModel.setSourceModel(model)
        self.completer.setModel(self.pFilterModel)

    def setModelColumn( self, column ):
        self.completer.setCompletionColumn(column)
        self.pFilterModel.setFilterKeyColumn(column)

    def view(self):
        return self.completer.popup()

    def index( self ):
        return self.currentIndex()

如果我以这种方式构建LinEdit,QCompleter就可以工作

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    model = QtGui.QStandardItemModel()

    for i,word in enumerate(['test', 'blah', 'heh', 'yep']):
        item = QtGui.QStandardItem(word)
        model.setItem(i, 0, item)

    lineEdit = LineEdit()
    lineEdit.setModel(model)
    lineEdit.setModelColumn(0)
    lineEdit.show()
    sys.exit(app.exec_())

编译很好,但不再显示QCompleter

if __name__ == '__main__':
    class Example(QtGui.QMainWindow):
        def __init__(self):
            QtGui.QMainWindow.__init__(self)

            self.centralWidget = QtGui.QWidget(self)
            self.layout = QtGui.QVBoxLayout(self.centralWidget)

            # can I push this inside the LineEdit class instead?
            model = QtGui.QStandardItemModel()
            for i, word in enumerate(['test', 'blah', 'heh', 'yep', 'hello', 'hi']):
                item = QtGui.QStandardItem(word)
                model.setItem(i, 0, item)

            # Make a LineEdit instance
            self.lineEdit = LineEdit(parent=self.centralWidget)
            self.lineEdit.setModel(model)
            self.lineEdit.setModelColumn(0)
            self.layout.addWidget(self.lineEdit)
            self.setCentralWidget(self.centralWidget)


    app = QtGui.QApplication(sys.argv)
    QtWin = Example()
    QtWin.show()
    sys.exit(app.exec_())

2 回答

  • 2

    事实证明这很简单,希望这会帮助其他人使用PyQt的QCompleter进行自动完成

    import sys
    from PyQt4 import QtCore, QtGui
    
    class LineEdit(QtGui.QLineEdit):
        def __init__(self, parent, completerContents):
            super(LineEdit, self).__init__(parent)
    
            self.completerList = QtCore.QStringList()
            for content in completerContents:
                self.completerList.append(QtCore.QString(content))
            self.completer = QtGui.QCompleter(self.completerList, self)
            self.completer.setCompletionMode(QtGui.QCompleter.PopupCompletion)
            self.completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
            self.setCompleter(self.completer)
    
    if __name__ == '__main__':
        class Example(QtGui.QMainWindow):
            def __init__(self):
                QtGui.QMainWindow.__init__(self)
    
                self.centralWidget = QtGui.QWidget(self)
                self.layout = QtGui.QVBoxLayout(self.centralWidget)
    
                # Example LineEdit Call
                self.lineEdit = LineEdit(parent=self.centralWidget, completerContents=('test', 'blah', 'heh', 'yep', 'hello', 'hi'))
    
                self.layout.addWidget(self.lineEdit)
                self.setCentralWidget(self.centralWidget)
    
    app = QtGui.QApplication(sys.argv)
    QtWin = Example()
    QtWin.show()
    sys.exit(app.exec_())
    
  • 0

    在第二种情况下,这种行为可能有两个原因:

    • 您的完成者在第二种情况下没有完成模型

    • 您的LineEdit已设置其他完成者

    不知道U是否可以调试它并在python中的QLineEdit :: setCompleter上设置断点 .

相关问题