首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:如何在QLineEdit中设置选项“QLineEdit”

Python:如何在QLineEdit中设置选项“QLineEdit”
EN

Stack Overflow用户
提问于 2021-12-01 18:27:23
回答 1查看 61关注 0票数 0

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

您看不到空格字符,这对于尾随空格来说尤其明显。我知道您可以通过在一个ShowTabsAndSpaces小部件的文档上调用方法setDefaultTextOption来设置选项setDefaultTextOption,但是有什么方法可以在QLineEdit小部件上设置这个选项(或类似的选项)吗?

方法setDefaultTextOption不适用于QLineEdit小部件,因此我尝试:

代码语言:javascript
复制
item = QLineEdit(value)
option = QTextOption()
option.setFlags(QTextOption.ShowTabsAndSpaces)
item.initStyleOption(option)

但这给了我一个例外:

代码语言:javascript
复制
<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)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-07 20:51:00

将@ekhumoro的建议用于端口https://stackoverflow.com/a/56298439/4459346

这导致:

代码语言:javascript
复制
#!/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: https://stackoverflow.com/a/56298439/4459346
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:  https://stackoverflow.com/a/46997337/4459346
        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方法,我从https://stackoverflow.com/a/46997337/4459346复制了该方法。

最初的方法试图计算精确的直线高度,但似乎没有得到完全正确的高度:

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70189444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档