C++ QLineEdit:显示已处理的文本,而不是输入的文本,但保留它(自定义回显模式)

C++ QLineEdit:显示已处理的文本,而不是输入的文本,但保留它(自定义回显模式),c++,qt,qt5,qlineedit,C++,Qt,Qt5,Qlineedit,我希望QLineEdit不显示输入的文本,而是显示经过处理的版本,同时保留原始文本并在通过text()请求时返回。就像密码回显模式一样,但我不希望每个字符都被屏蔽。我想使空间可视化: 例如。当输入一些中间有空格的文本时,应显示一些中间有空格的文本,以便查看空格。就像e。G您可以在LibreOffice中激活该¨符号 有QLineEdit::displayText(),但不能设置,只能读取。另外,echoMode只能通过枚举进行设置,设置了echoMode::Password后,处理似乎发生在QL

我希望
QLineEdit
不显示输入的文本,而是显示经过处理的版本,同时保留原始文本并在通过
text()
请求时返回。就像密码回显模式一样,但我不希望每个字符都被屏蔽。我想使空间可视化:

例如。当输入
一些中间有空格的文本时,应显示
一些中间有空格的文本
,以便查看空格。就像e。G您可以在LibreOffice中激活该¨符号

QLineEdit::displayText()
,但不能设置,只能读取。另外,
echoMode
只能通过枚举进行设置,设置了
echoMode::Password
后,处理似乎发生在
QLineEdit
的私有函数中,因此我也无法覆盖某些处理函数


这可能吗?

我想,使用
QLineEdit
很难做到这一点

但是,通过配置
QTextDocument
,使用
QTextEdit
非常简单:

class TextEdit : public QTextEdit
{
    Q_OBJECT
public:
        explicit TextEdit(QWidget* parent=nullptr): QTextEdit (parent)
        {
                QTextDocument* doc = new QTextDocument(this);
                setDocument(doc);
                QTextOption option;
                option.setFlags(QTextOption::ShowLineAndParagraphSeparators | QTextOption::ShowTabsAndSpaces);
                doc->setDefaultTextOption(option);
        }
};
然后,您必须配置
文本编辑
,以获得与
QLineEdit
相同的行为(即一行,无滚动条等)

作为良好开端的快速示例:

class OneLineTextEdit : public QTextEdit
{
    Q_OBJECT
public:
        explicit OneLineTextEdit(QWidget* parent=nullptr): QTextEdit (parent)
        {
                setTabChangesFocus(true);
                setWordWrapMode(QTextOption::NoWrap);
                // No scrollbars
                setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
                setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
                setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

                // One line only
                setFixedHeight(sizeHint().height());

                // Show the space/tabs/return
                QTextDocument* doc = new QTextDocument(this);
                setDocument(doc);
                QTextOption option;
                option.setFlags(QTextOption::ShowLineAndParagraphSeparators | QTextOption::ShowTabsAndSpaces);
                doc->setDefaultTextOption(option);
        }

    // We don't want to write more than one line
    void keyPressEvent(QKeyEvent *event)
    {
        if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter)
                return event->ignore();
        return QTextEdit::keyPressEvent(event);
    }

    // Don't display more than one line
    QSize sizeHint() const
    {
        QFontMetrics const fm(font());
        int const h = qMax(fm.height(), 14) + 4;
        int const w = fm.width(QLatin1Char('x')) * 17 + 4;
        QStyleOption opt;
        opt.initFrom(this);
        // Use the current app style to find the size of a real QLineEdit
        return (style()->sizeFromContents(QStyle::CT_LineEdit, &opt, QSize(w, h).
                expandedTo(QApplication::globalStrut()), this));
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    OneLineTextEdit *editor = new OneLineTextEdit();
    editor->show();

    return app.exec();
};

以下是我们最终所做的:

SpaceSliedIt.h:

#include <QPlainTextEdit>

class SpacesLineEdit : public QPlainTextEdit
{
    Q_OBJECT

public:
    explicit SpacesLineEdit(QWidget *parent = nullptr);
    void setText(const QString &text);
    QString text() const;

protected:
    virtual void keyPressEvent(QKeyEvent *event) override;
    virtual QSize sizeHint() const override;
    virtual QSize minimumSizeHint() const override;
    virtual void insertFromMimeData(const QMimeData *source) override;

private: // Variables
    QSize m_sizeHint;

};
#包括
类SpacesLineEdit:public QPlainTextEdit
{
Q_对象
公众:
显式空格slineedit(QWidget*parent=nullptr);
void setText(常量QString和text);
QString text()常量;
受保护的:
虚拟无效按键事件(QKeyEvent*事件)覆盖;
虚拟QSize sizeHint()常量覆盖;
虚拟QSize minimumSizeHint()常量覆盖;
虚拟void insertFromMimeData(常量QMimeData*源)重写;
私有变量
QSize m_sizeHint;
};
SpacesLineEdit.cpp:

#include "SpacesLineEdit.h"
#include <QLineEdit>
#include <QMimeData>

SpacesLineEdit::SpacesLineEdit(QWidget *parent) : QPlainTextEdit(parent)
{
    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    setLineWrapMode(QPlainTextEdit::NoWrap);
    setTabChangesFocus(true);

    QTextOption option = document()->defaultTextOption();
    option.setFlags(option.flags() | QTextOption::ShowTabsAndSpaces);
    document()->setDefaultTextOption(option);

    // Stealing the sizeHint from a plain QLineEdit will do for now :-P
    QLineEdit lineEdit;
    m_sizeHint = lineEdit.sizeHint();
}

QSize SpacesLineEdit::minimumSizeHint() const
{
    return m_sizeHint;
}

QSize SpacesLineEdit::sizeHint() const
{
    return m_sizeHint;
}

void SpacesLineEdit::keyPressEvent(QKeyEvent *event)
{
    if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) {
        event->ignore();
        return;
    }
    QPlainTextEdit::keyPressEvent(event);
}

void SpacesLineEdit::insertFromMimeData(const QMimeData *source)
{
    QString text = source->text();
    text.replace(QLatin1String("\r\n"), QLatin1String(" "));
    text.replace(QLatin1Char('\n'), QLatin1String(" "));
    text.replace(QLatin1Char('\r'), QLatin1String(" "));

    QMimeData processedSource;
    processedSource.setText(text);
    QPlainTextEdit::insertFromMimeData(&processedSource);
}

void SpacesLineEdit::setText(const QString &text)
{
    setPlainText(text);
}

QString SpacesLineEdit::text() const
{
    return toPlainText();
}
#包括“SpacesLineEdit.h”
#包括
#包括
SpacesLineEdit::SpacesLineEdit(QWidget*父项):QPlainTextEdit(父项)
{
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setLineWrapMode(QPlainTextEdit::NoWrap);
setTabChangesFocus(真);
QTextOption=document()->defaultTextOption();
option.setFlags(option.flags()| qtexoption::showtab和spaces);
document()->setDefaultTextOption(选项);
//从普通QLineEdit中窃取sizeHint现在就可以了:-P
QLineEdit-lineEdit;
m_sizeHint=lineEdit.sizeHint();
}
QSize SpacesLineEdit::minimumSizeHint()常量
{
返回m_sizeHint;
}
QSize SPACESLIENDIT::sizeHint()常量
{
返回m_sizeHint;
}
void SpacesLineEdit::keyPressEvent(QKeyEvent*事件)
{
if(event->key()==Qt::key_Return | | event->key()==Qt::key_Enter){
事件->忽略();
返回;
}
QPlainTextEdit::keyPressEvent(事件);
}
void SpacesLineEdit::insertFromMimeData(常量qimedata*源)
{
QString text=源->文本();
text.replace(QLatin1String(“\r\n”)、QLatin1String(“”);
text.replace(QLatin1Char('\n'),QLatin1String(“”);
text.replace(QLatin1Char('\r'),QLatin1String(“”);
QMimeData处理源;
processedSource.setText(文本);
QPlainTextEdit::insertFromMimeData(&processedSource);
}
void SpacesLineEdit::setText(常量QString&text)
{
设置纯文本(文本);
}
QString SpacesLineEdit::text()常量
{
返回toPlainText();
}

在Qt的语言学家看来,这也是Qt人员实现这一精确行为的方式。我想Qt开发者会知道;-)这解决了具体示例,但不是一般情况。这将改进解决一般情况的答案。lineEdit的enter键的行为应该是接受输入,而不是忽略事件。在我的特殊用例中,我需要这种行为。