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

12

学习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.setPlaceholderTexthttp://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。


1
非常感谢您清晰而有帮助的回复。 - eric
如何为占位符文本设置特定颜色 - abhi krishnan
嗯,这并不容易,如果有一个样式表[sub-control](http://doc.qt.io/qt-5/stylesheet-reference.html#list-of-sub-controls)会很好,但是没有。像[这个](https://pastebin.com/mia08m1H)这样的东西应该可以工作,使用事件过滤器根据需要更改组件的样式表。 - mata

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接