自动完成功能在focusIn上弹出,但无法在所选内容的QLineEdit中设置文本

2024-09-27 07:30:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

上面的代码可以工作,但我不能设置在事件中弹出的焦点自动完成中选择的文本。。你知道为什么我不能制作完成者选择的文本集吗?在


Tags: fromimportselfdefqtpyqt4qtguiqtcore
1条回答
网友
1楼 · 发布于 2024-09-27 07:30:03

问题是,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_())

相关问题 更多 >

    热门问题