在QT中,使用 setText()
方法创建的 lineEdit
显示文本。
但是默认文本的光标是可移动的。我希望默认文本的光标不能移动。
我的
lineEdit
类型已设置为密码。因此,默认文本(“密码”)也显示为“********”。当用户输入时,类型必须更改为密码,并且当没有文本或直到用户没有输入任何文本时,lineEdit
应显示纯文本“password”。
有什么解决上述两个问题的方法吗?
在QT中,使用 setText()
方法创建的 lineEdit
显示文本。
但是默认文本的光标是可移动的。我希望默认文本的光标不能移动。
我的 lineEdit
类型已设置为密码。因此,默认文本(“密码”)也显示为“********”。当用户输入时,类型必须更改为密码,并且当没有文本或直到用户没有输入任何文本时,lineEdit
应显示纯文本“password”。
有什么解决上述两个问题的方法吗?
ui->lineEdit->setPlaceholderText("password");
ui->lineEdit->setReadOnly(1);
在on_lineEdit_selectionChanged()
槽函数中,放置
ui->lineEdit->setText("");
ui->lineEdit->setEchoMode(QLineEdit::Password);
ui->lineEdit->setReadOnly(0);
我注意到这个问题有PyQt的标签,因此我会提供一个与该标签相关的实际答案,供那些真正寻找Python方式而不是C++的人参考。
self.searchEditText = QtGui.QLineEdit()
self.searchEditText.setPlaceholderText("Search for word")
我通过以下方式从 QLineEdit
派生一个类,以实现您想要的功能。
构造函数..
QCustomLineEdit::QCustomLineEdit(QWidget *parent) :
QLineEdit(parent)
{
connect(this, SIGNAL(textChanged(QString)), this, SLOT(onTextChanged(QString)));
connect(this, SIGNAL(cursorPositionChanged(int,int)), this, SLOT(onCursorPositionChanged(int,int)));
setEchoMode(QLineEdit::Password); // Echo mode in your case..
m_echoMode = echoMode(); // Member variable to store original echo mode..
m_placeHolderText = "Password"; // Member variable..
m_isPlaceHolderActive = true; // Member varible..
// Default case..
setPlaceholderText("");
setStyleSheet("QCustomLineEdit{color: gray;}");
setEchoMode(QLineEdit::Normal);
setText(__placeHolderText);
}
重载 keyPressEvent
方法..
void QCustomLineEdit::keyPressEvent(QKeyEvent *e)
{
if(m_isPlaceHolderActive)
{
if(e->key() == Qt::Key_Delete || e->key() == Qt::Key_Backspace)
e->accept();
else
QLineEdit::keyPressEvent(e);
return;
}
QLineEdit::keyPressEvent(e);
}
光标位置改变事件..
void QCustomLineEdit::onCursorPositionChanged(int /*oldPos*/, int newPos)
{
if(m_isPlaceHolderActive)
{
if(newPos != 0)
setCursorPosition(0);
}
}
void QCustomLineEdit::onTextChanged(const QString &text)
{
if(m_isPlaceHolderActive)
{
if(text.compare(m_placeHolderText) != 0)
{
m_isPlaceHolderActive = false;
// Remove the 'placeHolderText' from 'text' itself..
QString temp = text;
temp = temp.mid(0, text.lastIndexOf(m_placeHolderText));
setStyleSheet("QCustomLineEdit{color: black;}");
setEchoMode(m_echoMode);
setText(temp);
}
else
{
setEchoMode(QLineEdit::Normal);
setText(m_placeHolderText);
setStyleSheet("QCustomLineEdit{color: gray;}");
setCursorPosition(0);
}
}
else
{
if(text.isEmpty())
{
m_isPlaceHolderActive = true;
setStyleSheet("QCustomLineEdit{color: gray;}");
setEchoMode(QLineEdit::Normal);
setText(m_placeHolderText);
}
}
}
我很匆忙地写了这个,只是为了向您展示。请自行测试,并随时指出任何错误或优化。希望这有所帮助。
QLineEdit::paintEvent()
的源代码,您会注意到光标是使用 QTextLayout::drawCursor()
函数绘制的,该函数使用在 QPainter
中设置的当前笔,即 text-color
。因此,在绘制光标之前,您可以覆盖该 paintEvent()
并设置适当的 pen-color
。有点棘手.. :) - Ammar对于问题1,在Qt 5.0及更高版本中,使用setPlaceholderText可以达到您想要的效果。https://codereview.qt-project.org/#change,45326
setEchoMode(QLineEdit::Password)
与setPlaceholderText
也非常配合地使用。 - Shf