QLineEdit: показать обработанный текст, а не введенный, но сохранить его (режим пользовательского эха) - PullRequest
3 голосов
/ 18 мая 2019

Я хочу, чтобы QLineEdit отображал не введенный текст, а обработанную версию, сохраняя при этом исходный текст и возвращая его при запросе через text(). Как и в режиме ввода пароля, но я не хочу, чтобы каждый символ маскировался. Я хочу виасуализировать пробелы:

E. г. когда введено some text with spaces in between, должно быть показано some·text·with·spaces·in·between, чтобы можно было видеть пробелы. Прямо как когда г. Вы активируете этот символ in в LibreOffice.

Есть QLineEdit::displayText(), но его нельзя установить, только прочитать. Кроме того, echoMode можно установить только через enum, а при установленном EchoMode::Password обработка, по-видимому, происходит в частных функциях QLineEdit, так что я также не могу переопределить некоторые функции обработки.

Возможно ли это?

Ответы [ 2 ]

1 голос
/ 18 мая 2019

ИМХО, это будет трудно сделать с QLineEdit.

Но с QTextEdit это довольно просто, настроив QTextDocument:

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);
        }
};

Затем вам нужно настроить TextEdit для получения того же поведения, что и QLineEdit (то есть одна строка, полоса прокрутки отсутствует и т.1014 *

0 голосов
/ 24 мая 2019

Вот что наконец-то сделал:

SpacesLineEdit.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.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();
}
...