#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. Хммм, не так просто, было бы неплохо, если бы для этого был вспомогательный элемент управления таблицей стилей, но его нет. Что-то вроде этого должно работать, используя фильтр событий для изменения таблицы стилей компонента по мере необходимости.