2012-05-21 23 views
5

QTでは、setText()メソッドを使用してテキストを表示する行編集を作成しました。qlineeditにカーソルを移動しないでください。

  1. しかし、カーソルはデフォルトテキストのために移動可能です。私はカーソルがデフォルトのテキストのために移動できないようにしたい。

  2. 私のライン編集タイプがパスワードとして設定されています。したがって、デフォルトのテキスト( 'パスワード')も '********'として表示されます。ユーザーのタイプタイプは、パスワードのように変更する必要があり、そこにはテキストはありませんかユーザーまでの任意のテキストを入力していないとき、にQLineEditは

上記の問題を解決するために、任意のアイデアをプレーンテキスト「パスワード」を表示する必要があるときはいつでも2つの問題? enter image description here私は、次のとおりQLineEditからクラスを派生させることによって、あなたがやりたいことに成功し

答えて

3

..

コンストラクタ..

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); 
     } 
    } 
} 

カーソル位置の変更イベント私はちょうどお見せすることは非常に急いでそれを書かれています。自分でテストし、間違いや最適化を指差してもかまいません。お役に立てれば。コンストラクタで

+0

setPlaceholderText()メソッドは正常に動作します。しかし、qlineeditウィジェットが焦点を合わせたり、qlineeditでマウスをクリックするたびに、デフォルトのテキストが隠されます。ユーザーが任意のテキストを入力するまでカーソルを動かしてはならないという条件でカーソルがウィジェットにある場合でも、デフォルトのテキストを表示したい。 –

+0

ui-> lineEdit-> setText( "");を削除します。およびui-> lineEdit-> setEchoMode(QLineEdit :: Password); on_lineEdit_selectionChanged()から取得します。そして、ui-> lineEdit-> setEchoMode(QLineEdit :: Password)を追加します。 on_lineEdit_textEdited() – ScarCode

+0

@ user971306:更新された回答にいくつかのコードを追加しました。 – Ammar

6

は、

ui->lineEdit->setPlaceholderText("password"); 
ui->lineEdit->setReadOnly(1); 

そしてon_lineEdit_selectionChanged() SLOT中に入れQtの5.0以上で、質問1の場合

ui->lineEdit->setText(""); 
ui->lineEdit->setEchoMode(QLineEdit::Password); 
ui->lineEdit->setReadOnly(0); 
+0

ありがとうspyke。 setPlaceholderText()メソッドはうまくいきます。しかし、qlineeditウィジェットが焦点を合わせたり、qlineeditでマウスをクリックするたびに、デフォルトのテキストが隠されます。ユーザーが任意のテキストを入力するまでカーソルを動かしてはならないという条件で、カーソルがウィジェット内にある場合でも、デフォルトのテキストを表示したい。 –

2

を入れ、setPlaceholderTextは何をしたいん。 https://codereview.qt-project.org/#change,45326

+0

ここでは、リンクに与えられている内容を簡単に説明してください。あなたが助けたいのであれば、このリンクをコメントに入れることができます。これは本当に今の答えのようには見えません。 – Rachcha

+0

'setEchoMode(QLineEdit :: Password)'も 'setPlaceholderText'でQt 5.4以降でもうまく動作すると付け加えます。 – Shf

2

私はこの質問にタグpyqtがあることにお気づきになりました。実際には、そのタグに関連する実際の答えは、実際には、C++の代わりにPythonの方法を探している人にします。

self.searchEditText = QtGui.QLineEdit() 
self.searchEditText.setPlaceholderText("Search for word") 
+0

これはPython 3.5のpython 3.5で動作しました。ありがとうございました –

+0

ようこそ! – answerSeeker

関連する問題