2013-11-01 1 views
0
from PyQt4.Qt import Qt, QObject,QLineEdit 
from PyQt4 import QtGui, QtCore 

import utils 

class DirLineEdit(QLineEdit, QtCore.QObject): 
    """docstring for DirLineEdit""" 

    def __init__(self): 
     super(DirLineEdit, self).__init__() 
     self.xmlDataObj = utils.ReadWriteCustomPathsToDisk() 
     self.defaultList = self.xmlDataObj.xmlData().values() 
     self._pathsList() 

    def focusInEvent(self, event): 
     self.completer().complete() 

    def _pathsList(self):   
     completerList = QtCore.QStringList() 
     for i in self.defaultList: 
      completerList.append(QtCore.QString(i)) 
     lineEditCompleter = QtGui.QCompleter(completerList) 
     self.setCompleter(lineEditCompleter) 

    def __dirCompleter(self): 
     dirModel = QtGui.QFileSystemModel() 
     dirModel.setRootPath(QtCore.QDir.currentPath()) 
     dirModel.setFilter(QtCore.QDir.AllDirs | QtCore.QDir.NoDotAndDotDot | QtCore.QDir.Files) 
     dirModel.setNameFilterDisables(0) 
     completer = QtGui.QCompleter(dirModel, self)  
     completer.setModel(dirModel) 
     completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) 
     self.setCompleter(completer) 

app = QtGui.QApplication(sys.argv) 
smObj = DirLineEdit() 
smObj.show() 
app.exec_() 

Приведенный выше код работает, за исключением я не могу установить текст из выбора я делаю в автозаполнения, который выскакивает на фокус в случае .. Любая идея, почему я я не могу сделать установленный текст выбранным дополнением?Автодополнение выскакивает на focusIn но не может установить текст в QLineEdit от выбора

+0

Я ответил на ваш вопрос, но я бы посоветовал вам предоставить полную, работоспособный пример кода в будущем. Это значительно увеличит ваши шансы получить хорошие ответы. – ekhumoro

ответ

0

Проблема в том, что ваша повторная реализация focusInEvent не вызывает его базовый метод. Вы всегда должны это делать, если не уверены, что хотите полностью переопределить поведение по умолчанию. В этом конкретном случае также важно вызвать метод базового класса focusInEventдо, ссылаясь на дополнение, потому что это, очевидно, будет снова занять фокус.

Вот рабочий пример, который фиксирует проблемы в примере кода:

from PyQt4 import QtGui, QtCore 

class LineEdit(QtGui.QLineEdit): 
    def __init__(self, strings, parent): 
     QtGui.QLineEdit.__init__(self, parent) 
     self.setCompleter(QtGui.QCompleter(strings, self)) 

    def focusInEvent(self, event): 
     QtGui.QLineEdit.focusInEvent(self, event) 
     self.completer().complete() 

class Window(QtGui.QWidget): 
    def __init__(self): 
     QtGui.QWidget.__init__(self) 
     strings = 'one two three four five six seven eight'.split() 
     self.edit1 = LineEdit(strings, self) 
     self.edit2 = LineEdit(strings, self) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.edit1) 
     layout.addWidget(self.edit2) 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.show() 
    sys.exit(app.exec_()) 
+0

Спасибо, это потрясающе. мой второй вопрос заключается в том, как изменить составную часть из '_pathList' на' __dirCompleter'? Я хочу, чтобы пользовательские входы/или любой алфавит вместо того, чтобы показывать список путей, которые я теперь хочу сделать для просмотра в определенном месте? –

+0

@san. Если вы нашли ответ полезным, пожалуйста [отметьте его как принято] (http://meta.stackexchange.com/questions/16721/how-does-accept-rate-work/65088#65088). Кроме того, пожалуйста, не используйте комментарии, чтобы задавать вопросы - начните новую, чтобы все могли ее увидеть. – ekhumoro

+1

оценили, вот мой цент !!! –

Смежные вопросы