Есть ли способ установить выравнивание QTextEdit.placeholderText () в PyQt5? - PullRequest
0 голосов
/ 06 апреля 2020

Я знаю, что вы можете установить выравнивание текста , используя setAlignment(), но это не влияет на заполнитель текста . Может быть, вам нужно отредактировать styleSheet базового document, чтобы сделать это? Или документ относится только к фактическому тексту, но не к заполнителю?

Вот MWE, с которым можно поиграться:

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QDialog, QApplication, QGridLayout, QTextEdit


class Test(QDialog):
    def __init__(self):
        super().__init__()
        self.edit = QTextEdit()
        self.edit.setPlaceholderText(
            # '<html><body><p align="center">'
            'this is a placeholder'
            # '</p></body></html>'
        )
        self.edit.setAlignment(Qt.AlignHCenter)
        self.lay = QGridLayout(self)
        self.lay.addWidget(self.edit)
        self.setLayout(self.lay)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    GUI = Test()
    GUI.show()
    sys.exit(app.exec_())

1 Ответ

1 голос
/ 06 апреля 2020

Заполнитель не может быть напрямую настроен, так как он напрямую рисуется QTextEdit с использованием выравнивания по умолчанию по умолчанию, поэтому единственное решение - создать подкласс, перезаписать paintEvent и закрасить заполнитель, используя ваше собственное выравнивание.

Вы также можете добавить гораздо больше элементов управления, используя QTextDocument, который позволит вам использовать html и пользовательские цвета / выравнивание / et c.

html placeholder text

class HtmlPlaceholderTextEdit(QTextEdit):
    _placeholderText = ''
    def setPlaceholderText(self, text):
        if Qt.mightBeRichText(text):
            self._placeholderText = QTextDocument()
            try:
                color = self.palette().placeholderText().color()
            except:
                # for Qt < 5.12
                color = self.palette().windowText().color()
                color.setAlpha(128)
            # IMPORTANT: the default stylesheet _MUST_ be set *before*
            # adding any text, otherwise it won't be used.
            self._placeholderText.setDefaultStyleSheet(
                '''body {{color: rgba({}, {}, {}, {});}}
                '''.format(*color.getRgb()))
            self._placeholderText.setHtml(text)
        else:
            self._placeholderText = text
        self.update()

    def placeholderText(self):
        return self._placeholderText

    def paintEvent(self, event):
        super().paintEvent(event)
        if self.document().isEmpty() and self.placeholderText():
            qp = QPainter(self.viewport())
            margin = self.document().documentMargin()
            r = QRectF(self.viewport().rect()).adjusted(margin, margin, -margin, -margin)
            text = self.placeholderText()
            if isinstance(text, str):
                try:
                    color = self.palette().placeholderText().color()
                except:
                    # for Qt < 5.12
                    color = self.palette().windowText().color()
                    color.setAlpha(128)
                qp.setPen(color)
                qp.drawText(r, self.alignment() | Qt.TextWordWrap, text)
            else:
                text.setPageSize(self.document().pageSize())
                text.drawContents(qp, r)


class Test(QDialog):
    def __init__(self):
        super().__init__()
        self.edit = HtmlPlaceholderTextEdit()
        self.edit.setPlaceholderText(
            '<html><body><p align="center">'
            'this is a <font color="blue">placeholder</font>'
            '</p></body></html>'
        )
        # ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...