[prev in list] [next in list] [prev in thread] [next in thread] 

List:       pykde
Subject:    [PyQt] QCompleter in a QLineEdit
From:       "C. B. Esquire" <crackerbunny () gmail ! com>
Date:       2011-04-27 6:29:48
Message-ID: BANLkTimLYebgEYZDve4BrPBAL64uhFPLww () mail ! gmail ! com
[Download RAW message or body]

[Attachment #2 (multipart/alternative)]


(let me know if the space/tab formatting didn't come through and I'll attach
the python script instead)

I'm trying to create a QCompleter, which works fine if I just build the
QLineEdit.
However if I drop the QLineEdit into a QMainWindow, the QCompleter no longer
works. What am I doing wrong here?


*# 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)

        self.setModelColumn(0)

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

*# Instance 1: This works just fine*
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_())
*
**# Instance 2: Building** the LineEdit inside a QMainWindow the QCompleter
doesn't work any more ~*
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.layout.addWidget(self.lineEdit)
            self.setCentralWidget(self.centralWidget)


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






*
### Also a side question, is there a way to put the model code inside the
LineEdit class? When I put the model logic inside, it also seems to quietly
stop working.*

            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)

[Attachment #5 (text/html)]

(let me know if the space/tab formatting didn&#39;t come through and I&#39;ll attach \
the python script instead)<br><br>I&#39;m trying to create a QCompleter, which works \
fine if I just build the QLineEdit. <br>However if I drop the QLineEdit into a \
QMainWindow, the QCompleter no longer works. What am I doing wrong here?<br> \
<br><br><b># LineEdit class</b><br>import sys<br>from PyQt4 import QtCore, \
QtGui<br><br>class LineEdit(QtGui.QLineEdit):<br>    def __init__(self, \
parent=None):<br>        super(LineEdit, self).__init__(parent)<br>        <br>  \
self.setFocusPolicy(QtCore.Qt.StrongFocus)<br>        <br>        self.completer = \
QtGui.QCompleter(self)<br>        \
self.completer.setCompletionMode(QtGui.QCompleter.UnfilteredPopupCompletion)<br>      \
self.pFilterModel = QtGui.QSortFilterProxyModel(self)<br>  \
self.pFilterModel.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive)<br>        \
self.completer.setPopup(self.view())<br>        self.setCompleter(self.completer)<br> \
self.textEdited[unicode].connect(self.pFilterModel.setFilterFixedString)<br>  <br>    \
self.setModelColumn(0)<br>        <br>    def setModel(self, model):<br>        \
self.pFilterModel.setSourceModel(model)<br>        \
self.completer.setModel(self.pFilterModel)<br>        <br>    def setModelColumn( \
self, column ):<br>  self.completer.setCompletionColumn(column)<br>        \
self.pFilterModel.setFilterKeyColumn(column)<br>            <br>    def \
view(self):<br>        return self.completer.popup()<br>            <br>    def \
index( self ):<br>  return self.currentIndex()<br>        <br><b># Instance 1: This \
works just fine</b><br>if __name__ == &quot;__main__&quot;:<br>    app = \
QtGui.QApplication(sys.argv)<br>    <br>    model = QtGui.QStandardItemModel()<br>  \
<br>    for i,word in enumerate([&#39;test&#39;, &#39;blah&#39;, &#39;heh&#39;, \
&#39;yep&#39;]):<br>        item = QtGui.QStandardItem(word)<br>        \
model.setItem(i, 0, item)<br>        <br>    lineEdit = LineEdit()<br>  \
lineEdit.setModel(model)<br>    lineEdit.setModelColumn(0)<br>    lineEdit.show()<br> \
sys.exit(app.exec_())<br><b><br></b><b># Instance 2: Building</b><b> the LineEdit \
inside a QMainWindow the QCompleter doesn&#39;t work any more ~</b><br> if __name__ \
== &#39;__main__&#39;:<br>    class Example(QtGui.QMainWindow):<br>        def \
__init__(self):<br>            QtGui.QMainWindow.__init__(self)<br>            <br>   \
self.centralWidget = QtGui.QWidget(self)<br>  self.layout = \
QtGui.QVBoxLayout(self.centralWidget)<br>            <br>            # can I push \
this inside the LineEdit class instead?<br>            model = \
QtGui.QStandardItemModel()<br>            for i, word in enumerate([&#39;test&#39;, \
&#39;blah&#39;, &#39;heh&#39;, &#39;yep&#39;, &#39;hello&#39;, &#39;hi&#39;]):<br>  \
item = QtGui.QStandardItem(word)<br>                model.setItem(i, 0, item)<br>     \
<br>            # Make a LineEdit instance<br>            self.lineEdit = \
LineEdit(parent=self.centralWidget)<br>  self.lineEdit.setModel(model)<br>            \
<br>            self.layout.addWidget(self.lineEdit)<br>            \
self.setCentralWidget(self.centralWidget)<br>            <br>            <br>    app \
= QtGui.QApplication(sys.argv)<br>  QtWin = Example()<br>    QtWin.show()<br>    \
sys.exit(app.exec_())<br><br><br><br><br><br><br><i><b><br>### Also a side question, \
is there a way to put the model code inside the LineEdit class? When I put the model \
logic inside, it also seems to quietly stop working.</b></i><br> <br>            \
model = QtGui.QStandardItemModel()<br>            for i, word in \
enumerate([&#39;test&#39;, &#39;blah&#39;, &#39;heh&#39;, &#39;yep&#39;, \
&#39;hello&#39;, &#39;hi&#39;]):<br>                item = \
QtGui.QStandardItem(word)<br>  model.setItem(i, 0, item)<br>                <br>      \
# Make a LineEdit instance<br>            self.lineEdit = \
LineEdit(parent=self.centralWidget)<br>            self.lineEdit.setModel(model)<br>



_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic