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

标签 c++ qt qt5 qlineedit

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

E. G。当输入 some text with spaces in between 时,some·text·with·spaces·in·between 应该显示出来,这样就可以看到空格。就像当 e. G。您在 LibreOffice 中激活那个 ¶ 符号。

QLineEdit::displayText(),但是不能设置,只能读取。此外,echoMode 只能通过枚举设置,并且在 EchoMode::Password 设置的情况下,处理似乎发生在 QLineEdit 的私有(private)函数中>,这样我也无法重写某些处理函数。

这可能吗?

最佳答案

恕我直言,使用 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);
        }
};

然后,您必须配置 TextEdit 以获得与 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();
};

关于c++ - QLineEdit:显示处理过的文本,而不是输入的文本,但保留它(自定义回显模式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56196629/

相关文章:

qt - 使用QT 5.8 Ubuntu构建新应用程序的问题

c++ - QSerialPort 5.2 中的 SerialPortError?

qt - 进度条周围有不同的文字颜色?

qt - 移动文本框编辑区域

c++ - Unreal C++ 使用线条跟踪从 Actor 调用 void

C++ 和命令行选项

python - 如何使用 Boost.Python 将 NumPy ndarray 转换为 C++ vector 并返回?

c++ - 模板参数推导与 QT lambda 不匹配

python - Py_Initialize 在 Windows 操作系统上崩溃

C++/g++ : Concurrent program