Qt4 如何设置QTextEdit的占位符文本

Qt4 如何设置QTextEdit的占位符文本,qt4,qtextedit,qt4.7,Qt4,Qtextedit,Qt4.7,我想设置QTextEdit的占位符文本。我知道如何将其设置为QLineEdit,有一个属性setPlaceHolderText。但此属性不适用于QTextEdit。请给出您有价值的建议以解决此问题。使用QTextEdit的功能。使用以下逻辑 QTextCursor textCursor; textCursor.setPosistion(0, QTextCursor::MoveAnchor); textedit->setTextCursor( textCursor ); 我可

我想设置
QTextEdit
的占位符文本。我知道如何将其设置为
QLineEdit
,有一个属性
setPlaceHolderText
。但此属性不适用于
QTextEdit
。请给出您有价值的建议以解决此问题。

使用QTextEdit的功能。使用以下逻辑

  QTextCursor textCursor;
  textCursor.setPosistion(0, QTextCursor::MoveAnchor); 
  textedit->setTextCursor( textCursor );

我可以通过子类化和重写paint事件来实现这一点:

class PlainTextEditWithPlaceholderText(QtGui.QPlainTextEdit):
    def __init__(self, parent=None):
        super(PlainTextEditWithPlaceholderText, self).__init__(parent)
        self.placeholderText = ""  # Qt-style camelCase

    def setPlaceholderText(self, text):
        self.placeholderText = text

    def paintEvent(self, _event):
        """
        Implements the same behavior as QLineEdit's setPlaceholderText()
        Draw the placeholder text when there is no text entered and the widget 
        doesn't have focus.
        """
        if self.placeholderText and not self.hasFocus() and not self.toPlainText():
            painter = QtGui.QPainter(self.viewport())

            color = self.palette().text().color()
            color.setAlpha(128)
            painter.setPen(color)

            painter.drawText(self.geometry().topLeft(), self.placeholderText)

        else:
            super(PlainTextEditWithPlaceholderText, self).paintEvent(event)

从Qt5.3开始,添加了属性,因此您现在只需调用

,我发现有点缺少,因为它无法正确格式化文本。从那时起,我在Qt5中找到了它的源代码,并在Python中重新实现了我所能实现的

它有一个或两个更改,但总体来说似乎工作得很好,它将文本放在正确的位置,并支持对新行使用
\n

注意:这是在PySide中测试的,如果不使用该文件,则需要将
QtWidgets
重新映射回
QtGui

class QPlainTextEdit(QtWidgets.QPlainTextEdit):
    """QPlainTextEdit with placeholder text option.
    Reimplemented from the C++ code used in Qt5.
    """
    def __init__(self, *args, **kwargs):
        super(QPlainTextEdit, self).__init__(*args, **kwargs)

        self._placeholderText = ''
        self._placeholderVisible = False
        self.textChanged.connect(self.placeholderVisible)

    def placeholderVisible(self):
        """Return if the placeholder text is visible, and force update if required."""
        placeholderCurrentlyVisible = self._placeholderVisible
        self._placeholderVisible = self._placeholderText and self.document().isEmpty() and not self.hasFocus()
        if self._placeholderVisible != placeholderCurrentlyVisible:
            self.viewport().update()
        return self._placeholderVisible

    def placeholderText(self):
        """Return text used as a placeholder."""
        return self._placeholderText

    def setPlaceholderText(self, text):
        """Set text to use as a placeholder."""
        self._placeholderText = text
        if self.document().isEmpty():
            self.viewport().update()

    def paintEvent(self, event):
        """Override the paint event to add the placeholder text."""
        if self.placeholderVisible():
            painter = QtGui.QPainter(self.viewport())
            colour = self.palette().text().color()
            colour.setAlpha(128)
            painter.setPen(colour)
            painter.setClipRect(self.rect())
            margin = self.document().documentMargin()
            textRect = self.viewport().rect().adjusted(margin, margin, 0, 0)
            painter.drawText(textRect, QtCore.Qt.AlignTop | QtCore.Qt.TextWordWrap, self.placeholderText())
        super(QPlainTextEdit, self).paintEvent(event)

如果您需要在开始键入之前保留文本,只需删除
not self.hasFocus()
部分。

与论坛网站不同,我们不使用“谢谢”或“感谢任何帮助”或签名。看到了吗?你到底是怎么做到的?我不得不加上一个
self.viewport().update()
并重新定位文本,但其他方面效果很好!谢谢!我觉得这很有趣-我需要再做一次,因为我忘了上次我把代码放在哪里了。我通过
Rafe
找到了答案,但效果不太好,所以我向下滚动并看到了这一点,真的很高兴有人花时间改进了它。我尝试了d向上投票,发现这是我自己的答案。编码以一种神秘的方式工作。我们可以很高兴有这样一个网站!你让我高兴。:d