占位符文本未显示(pyside/pyqt)

12 投票
1 回答
21712 浏览
提问于 2025-04-18 10:09

我在学习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。

撰写回答