Search code examples
pythonpyqtsignals-slotsqt-designerqlistwidget

PyQt: ListWidget.insertItem not shown


I have a fairly simply PyQt question. (Python 3.4, PyQt 4.11.3, Qt 4.8.5) I built a very simple dialog using Qt Designer (Ui_Dialog). This object has a QPushButton, a QLineEdit, and a QListWidget. I wrote another object that inherits from Ui_Dialog, and sets up a returnPressed signal from QLineEdit that should add some text to the QListWidget. Unfortunately, this does not work.

Here's my code:

import sys

from PyQt4 import QtGui

from dialog import Ui_Dialog

class ImDialog(QtGui.QDialog, Ui_Dialog):
    def __init__(self):
        super(ImDialog, self).__init__()

        self.setupUi(self)
        self.lineEdit.returnPressed.connect(self.additem)
        self.pushButton.clicked.connect(self.listWidget.clear)

    def additem(self):
        text = self.lineEdit.text()
        print(text)
        self.listWidget.insertItem(0, text)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    ui = ImDialog()
    ui.show()
    sys.exit(app.exec_())

The text in the line editor prints fine to the terminal, but it is not added to the listWidget.

Interestingly, if I comment out the sys.exit line and run this in an IPython terminal, I can add as much text as I like to the listWidget without a problem.

[In 1]: %run that_program.py

[In 2]: ui.listWidget.insertItem(0, "Test") # This works fine

If anyone has any suggestions to get this to work (outside IPython), I would appreciate the help. Thanks


Solution

  • There is only one button in your dialog, and so it will become the auto-default. This means that whenever you press enter in the dialog, the button will receive a press event, even if it doesn't currently have the keyboard focus.

    So the item does get added to the list-widget - it's just that it then immediately gets cleared by the auto-default button.

    To fix this, reset the auto-default like so:

        self.pushButton.setAutoDefault(False)
    

    (NB: you can also change this property in Qt Designer).