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

Tob*_*old 5 c++ qt qlineedit qt5

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

\n\n

例如 当some text with spaces in between输入时,some\xc2\xb7text\xc2\xb7with\xc2\xb7spaces\xc2\xb7in\xc2\xb7between应显示出来以便人们可以看到空格。就像您在 LibreOffice 中激活 \xc2\xb6 符号一样。

\n\n

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

\n\n

这可能吗?

\n

Rom*_*rev 2

恕我直言,用QLineEdit.

QTextEdit但是,通过配置它来使用 a 非常容易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);
        }
};
Run Code Online (Sandbox Code Playgroud)

然后,您必须配置TextEdit以获得与 a 相同的行为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();
};
Run Code Online (Sandbox Code Playgroud)