占位符文本未显示(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 个回答
19
因为你的控件里只有一个组件(就是 QLineEdit
),所以这个组件在一开始就会自动获得焦点。只有当这个输入框是空的并且没有获得焦点时,才会显示占位符文本。你可以在这里查看详细信息:占位符文本的说明。
一个简单的解决办法是在显示你的控件之前,先让其他组件获得焦点,比如在 self.show()
之前插入 self.setFocus()
。
不过这样的话,用户就得先点击文本框或者按 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。