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

#python #qt #user-interface #pyqt #pyside

#python #qt #пользовательский интерфейс #pyqt #pyside

Вопрос:

Изучая 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:

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

Простым решением было бы сфокусировать другой компонент для отображения вашего виджета, например, путем вставки self.setFocus() before 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.

Комментарии:

1. Большое спасибо за этот ясный и полезный ответ.

2. Как установить определенный цвет для текста-заполнителя

3. Хммм, не так просто, было бы неплохо, если бы для этого был вспомогательный элемент управления таблицей стилей, но его нет. Что-то вроде этого должно работать, используя фильтр событий для изменения таблицы стилей компонента по мере необходимости.