Текст заполнителя не отображается (pyside/pyqt)

изучая PySide, я настраиваю виджет редактирования текста (QLineEdit) и пытаюсь установить текст-заполнитель с помощью setPlaceHolderText, как в приведенном ниже фрагменте кода (который я вызываю из main). К сожалению, он работает не так, как я ожидал. Код выполняется, но текстовое поле пустое, не отображает текст-заполнитель. Я нахожусь в Windows 7, Python 2.7 (работает в iPython).

class MyTextEdit(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.textEditor=QtGui.QLineEdit(self) 
        self.textEditor.move(50,15)
        self.textEditor.setPlaceholderText("Don't mind me.") 
        self.setGeometry(100, 100, 200, 50)
        self.show()        

кто-нибудь понимает, что я делаю неправильно? Я следую примерам из следующего: сайты:

http://nullege.com/codes/search/PyQt4.QtGui.QLineEdit.setPlaceholderText

http://www.pythoncentral.io/pyside-pyqt-tutorial-interactive-widgets-and-layout-containers/

и не смотри, что я делаю по-другому.

1 ответов


как ваш виджет содержит только один компонент (QLineEdit), этот компонент всегда будет захватывать фокус изначально. Текст-заполнитель только если редактирование пусто и не имеет фокуса*.

простым решением было бы сфокусировать другой компонент для показа вашего виджета, например при вставке self.setFocus() до self.show().
Недостатком является то, что таким образом пользователь должен щелкнуть в текстовое поле или нажмите Tab перед тем, как писать в поле. Чтобы избежать этого, вы можете перехватить keyPress событие в виджете.

пример:

class MyTextEdit(QtGui.QWidget):
    '''Some positioning'''
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.textEditor=QtGui.QLineEdit(self) 
        self.textEditor.move(50,15)
        self.textEditor.setPlaceholderText("Hi I'm de fault.") 
        self.setGeometry(100, 100, 200, 50)
        self.setFocus()
        self.show()

    def keyPressEvent(self, evt):
        self.textEditor.setFocus()
        self.textEditor.keyPressEvent(evt)

*Примечание: это изменилось в Qt5 где текст заполнителя отображается, пока строка редактирования пуста. К сожалению, PySide не поддерживает Qt5 (пока), поэтому вам придется использовать PyQt5.