PyQt: ListWidget.insertItem не показан

У меня довольно простой вопрос PyQt. (Python 3.4, PyQt 4.11.3, Qt 4.8.5) Я создал очень простой диалог с помощью Qt Designer (Ui_Dialog). У этого объекта есть QPushButton, QLineEdit и QListWidget. Я написал еще один объект, который наследуется от Ui_Dialog, и настроил сигнал returnPressed от QLineEdit, который должен добавить текст в QListWidget. К сожалению, это не работает.

Вот мой код:

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

Текст в линейном редакторе отлично выводится на терминал, но не добавляется в listWidget.

Интересно, что если я закомментирую строку sys.exit и запускаю ее в терминале IPython, я могу без проблем добавить столько текста, сколько захочу, в listWidget.

[In 1]: %run that_program.py

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

Если у кого-то есть предложения, как заставить это работать (за пределами IPython), я был бы признателен за помощь. Спасибо


person Ryan    schedule 10.12.2014    source источник


Ответы (1)


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

Таким образом, элемент действительно добавляется в виджет-список - просто он сразу же очищается кнопкой, устанавливаемой автоматически по умолчанию.

Чтобы исправить это, сбросьте автоматическое значение по умолчанию следующим образом:

    self.pushButton.setAutoDefault(False)

(NB: вы также можете изменить это свойство в Qt Designer).

person ekhumoro    schedule 10.12.2014
comment
Спасибо за очень полезный совет. Я бился головой об стену этим. Я рад, что он действительно делал то, что я думал. В будущем мне придется следить за этим поведением по умолчанию. - person Ryan; 11.12.2014