QlineEdit с текстом по умолчанию, для которого курсор не следует перемещать?
в QT создан lineEdit
показывает текст с помощью setText()
метод.
но курсор перемещается для текста по умолчанию. Я хочу, чтобы курсор не перемещался для текста по умолчанию.
мой
lineEdit
тип был установлен в качестве пароля. Следовательно, текст по умолчанию('пароль') также отображается как '********'. Всякий раз, когда пользователь вводит тип должен быть изменен как пароль, и когда нет текста или пока пользователь не набрал текст, thelineEdit
должен отображать простой текст "пароль"
любая идея исправить вышеуказанные две проблемы?
4 ответов
мне удалось сделать то, что вы хотите, производный класс 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);
}
}
}
Я написал это очень поспешно, чтобы просто показать вы. Проверьте его самостоятельно и не стесняйтесь указывать любую ошибку(ы) или оптимизацию(ы). Надеюсь, это поможет.
в конструктор ставим
ui->lineEdit->setPlaceholderText("password");
ui->lineEdit->setReadOnly(1);
и on_lineEdit_selectionChanged()
слот, поставить
ui->lineEdit->setText("");
ui->lineEdit->setEchoMode(QLineEdit::Password);
ui->lineEdit->setReadOnly(0);
для вопроса 1 в Qt 5.0 и выше setPlaceholderText делает то, что вы хотите. https://codereview.qt-project.org/#change,45326
Я заметил, что этот вопрос имеет тег pyqt, поэтому я поставлю фактический ответ, связанный с этим тегом для тех, кто действительно ищет путь python вместо c++.
self.searchEditText = QtGui.QLineEdit()
self.searchEditText.setPlaceholderText("Search for word")