..
コンストラクタ..
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);
}
}
}
カーソル位置の変更イベント私はちょうどお見せすることは非常に急いでそれを書かれています。自分でテストし、間違いや最適化を指差してもかまいません。お役に立てれば。コンストラクタで
setPlaceholderText()メソッドは正常に動作します。しかし、qlineeditウィジェットが焦点を合わせたり、qlineeditでマウスをクリックするたびに、デフォルトのテキストが隠されます。ユーザーが任意のテキストを入力するまでカーソルを動かしてはならないという条件でカーソルがウィジェットにある場合でも、デフォルトのテキストを表示したい。 –
ui-> lineEdit-> setText( "");を削除します。およびui-> lineEdit-> setEchoMode(QLineEdit :: Password); on_lineEdit_selectionChanged()から取得します。そして、ui-> lineEdit-> setEchoMode(QLineEdit :: Password)を追加します。 on_lineEdit_textEdited() – ScarCode
@ user971306:更新された回答にいくつかのコードを追加しました。 – Ammar