Python: 如何在 QLineEdit 中设置选项 "ShowTabsAndSpaces"

Python: How to set option "ShowTabsAndSpaces" in QLineEdit

我有一个 QLineEdit 小部件可以输入包含 space 的文本(一个简单的搜索模式)。

您看不到 space 个字符,这对于结尾的 space 字符尤其明显。我知道您可以通过在 QTextEdit 小部件的文档上调用方法 setDefaultTextOption 来设置选项 ShowTabsAndSpaces,但是有没有办法在 [=14] 上设置此选项(或类似的东西) =] 小部件?

方法 setDefaultTextOption 不适用于 QLineEdit 小部件,所以我尝试了:

item = QLineEdit(value)
option = QTextOption()
option.setFlags(QTextOption.ShowTabsAndSpaces)
item.initStyleOption(option)

但这给了我一个例外:

<class 'TypeError'>: 
'PySide2.QtWidgets.QLineEdit.initStyleOption' called with wrong argument types:
  PySide2.QtWidgets.QLineEdit.initStyleOption(PySide2.QtGui.QTextOption)
Supported signatures:
  PySide2.QtWidgets.QLineEdit.initStyleOption(PySide2.QtWidgets.QStyleOptionFrame)

如何在 QLineEdit 小部件上设置选项 ShowTabsAndSpaces 或者是否有其他方法使 space 个字符在 QLineEdit 小部件中可见。我会很高兴只有 space 个可见的字符。

使用@ekhumoro 的建议移植

这导致:

#!/usr/bin/env python3

import sys
import time
from PySide2.QtWidgets import (QLineEdit, QPushButton, QApplication,
    QVBoxLayout, QDialog, QMessageBox, QPlainTextEdit, QGridLayout)
from PySide2.QtCore import (Qt, QMimeData)
from PySide2.QtGui import (QTextOption, QFontMetrics)

# source: 
class SpacesLineEdit(QPlainTextEdit):
    def __init__(self, text=None):
        if text:
            super().__init__(text)
        else:
            super().__init__()
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setLineWrapMode(QPlainTextEdit.NoWrap)
        self.setTabChangesFocus(True)

        option = QTextOption()
        option.setFlags(QTextOption.ShowTabsAndSpaces)
        self.document().setDefaultTextOption(option)

        # limit height to one line
        self.setHeight(1)

        # Stealing the sizeHint from a plain QLineEdit will do for now :-P
        self._sizeHint = QLineEdit().sizeHint()

    def minimumSizeHint(self):
        return self._sizeHint

    def sizeHint(self):
        return self._sizeHint

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter:
            event.ignore()
            return
        super().keyPressEvent(event)

    def insertFromMimeData(self, source):
        text = source.text()
        text = text.replace(str('\r\n'), str(' '))
        text = text.replace(str('\n'), str(' '))
        text = text.replace(str('\r'), str(' '))
        processedSource = QMimeData()
        processedSource.setText(text)
        super().insertFromMimeData(processedSource)

    def setText(self, text):
        self.setPlainText(text)

    def text(self):
        return self.toPlainText()

    def setHeight1(self):
        # see 
        doc = self.document()
        b = doc.begin()
        layout = doc.documentLayout()
        h = layout.blockBoundingRect(b).height()
        self.setFixedHeight(h  + 2 * self.frameWidth() + 1)

    def setHeight(self, nRows):
        # source:  
        pdoc = self.document()
        fm = QFontMetrics(pdoc.defaultFont())
        lineSpacing = fm.lineSpacing()
        print(lineSpacing)  # todo:test
        margins = self.contentsMargins()
        nHeight = lineSpacing * nRows + \
            (pdoc.documentMargin() + self.frameWidth()) * 2 + \
            margins.top() + margins.bottom()
        self.setFixedHeight(nHeight)


class Form(QDialog):

    def __init__(self, parent=None):
        super(Form, self).__init__(parent)
        demoText = " some text with spaces "
        self.lineedit0 = QLineEdit(demoText)
        self.lineedit1 = SpacesLineEdit(demoText)
        self.lineedit2 = QLineEdit(demoText)
        self.lineedit3 = QLineEdit(demoText)
        layout = QGridLayout()
        layout.addWidget(self.lineedit0, 0, 0)
        layout.addWidget(self.lineedit1, 1, 0)
        layout.addWidget(self.lineedit2, 0, 1)
        layout.addWidget(self.lineedit3, 1, 1)
        self.setLayout(layout)
    
if __name__ == '__main__':
    app = QApplication(sys.argv)
    form = Form()
    print('starting app...')
    form.show()
    sys.exit(app.exec_())

现在显示了空格,正如我想要的那样。

我唯一需要添加的是设置高度的方法。请参阅我从 .

复制的方法 setHeight

原来的方法试图计算准确的行高,但似乎没有得到完全正确的高度:

左下角的是 QPlainTextEdit,其他三个只是 qlineEdit 个小部件。

我可以通过减去几个像素来修复不正确的高度,但我不想在不知道自己在做什么的情况下这样做。

任何人,有任何改进方法 setHeight 中的代码的建议吗?