我想要一个 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/