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键的行为应该是接受输入,而不是忽略事件。在我的特殊用例中,我需要这种行为。