2012-05-21 32 views
5

En QT, creó un lineedit que muestra un texto usando el método setText().qlineedit con texto predeterminado para el cual no se debe mover el cursor?

  1. Pero el cursor se puede mover para el texto predeterminado. Quiero que el cursor no se pueda mover para el texto predeterminado.

  2. my lineedit tipo se ha establecido como contraseña. Por lo tanto, el texto predeterminado ('Contraseña') también se muestra como '********'. Siempre que los tipos de usuario del tipo tiene que ser cambiado como contraseña y cuando no hay texto o hasta que el usuario no ha escrito ningún texto, el QLineEdit debe mostrar el texto sin formato 'contraseña'

Alguna idea para solucionar el anterior dos problemas? enter image description here

Respuesta

3

me las arreglé para hacer lo que quiere mediante la derivación de una clase de QLineEdit según siguiente ..

Constructor ..

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

Anulación keyPressEvent ..

Cambio de posición
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); 
} 

cursor evento .. evento de cambio de

void QCustomLineEdit::onCursorPositionChanged(int /*oldPos*/, int newPos) 
{ 
    if(m_isPlaceHolderActive) 
    { 
     if(newPos != 0) 
      setCursorPosition(0); 
    } 
} 

texto ..

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

he escrito muy de prisa que usted acaba de mostrar. Pruébelo usted mismo y siéntase libre de señalar cualquier error u optimización (es). Espero que esto ayude.

+0

setPlaceholderText() método funciona bien. Pero cada vez que se enfoca el widget qlineedit o se hace clic en qlineedit, se oculta el texto predeterminado. Quiero mostrar el texto predeterminado incluso cuando el cursor está en el widget con la condición de que el cursor no se mueva hasta que el usuario escriba cualquier texto. –

+0

Ok. Eliminar ui-> lineEdit-> setText (""); y ui-> lineEdit-> setEchoMode (QLineEdit :: Password); de on_lineEdit_selectionChanged().Y agregue ui-> lineEdit-> setEchoMode (QLineEdit :: Password); en on_lineEdit_textEdited() – ScarCode

+0

@ user971306: He agregado un código en mi respuesta actualizada. – Ammar

6

En el constructor puso

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

Y en on_lineEdit_selectionChanged() SLOT, poner

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

Gracias spyke. El método setPlaceholderText() funciona bien. Pero cada vez que se enfoca el widget qlineedit o se hace clic en qlineedit, se oculta el texto predeterminado. Quiero mostrar el texto predeterminado incluso cuando el cursor está en el widget con la condición de que el cursor no se mueva hasta que el usuario escriba cualquier texto ... –

2

Para la pregunta 1, en Qt 5.0 y superior, setPlaceholderText hace lo que quiere. https://codereview.qt-project.org/#change,45326

+0

Por favor, describa en breve aquí lo que se da en el enlace. Si desea ayudar, puede poner este enlace en un comentario. Esto no parece realmente una respuesta en este momento. – Rachcha

+0

Yo agregaría que 'setEchoMode (QLineEdit :: Password)' también funciona muy bien con 'setPlaceholderText' ya que Qt 5.4 y superior también – Shf

2

Me di cuenta de que esta pregunta tiene la etiqueta pyqt, así que voy a poner una respuesta real relacionada con esa etiqueta para aquellos que realmente buscan una forma de python en lugar de C++.

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

esto funcionó para mí en python 3.5 en pyqt4, gracias –

+0

¡De nada! – answerSeeker

Cuestiones relacionadas