2012-05-21 10 views
5

क्यूटी में, एक लाइनेडिटिट बनाया जो setText() विधि का उपयोग करके एक टेक्स्ट दिखाता है।qlineedit कुछ डिफ़ॉल्ट पाठ के साथ जिसके लिए कर्सर को स्थानांतरित नहीं किया जाना चाहिए?

  1. लेकिन कर्सर डिफ़ॉल्ट पाठ के लिए चल रहा है। मैं चाहता हूं कि कर्सर को डिफ़ॉल्ट पाठ के लिए चलने योग्य नहीं होना चाहिए।

  2. मेरी lineedit प्रकार पासवर्ड के रूप में स्थापित किया गया है। इसलिए डिफ़ॉल्ट पाठ ('पासवर्ड') को '********' के रूप में भी प्रदर्शित किया जाता है। उपयोगकर्ता प्रकार प्रकार है पासवर्ड के रूप में परिवर्तित करने की जब भी और जब कोई पाठ या उपयोगकर्ता किसी भी पाठ नहीं लिखा है, जब तक वहाँ है, qlineedit किसी भी विचार सादा पाठ 'पासवर्ड'

प्रदर्शित करना चाहिए इसके बाद के संस्करण ठीक करने के लिए दो मुद्दे? enter image description here

उत्तर

3

मैं .. निम्नलिखित के अनुसार 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); 
     } 
    } 
} 

मुझे यह बहुत जल्दी से केवल आपके दिखाने के लिए लिखा है। इसे स्वयं परीक्षण करें और किसी भी गलती या अनुकूलन को इंगित करने के लिए स्वतंत्र महसूस करें। उम्मीद है की यह मदद करेगा।

+0

setPlaceholderText() विधि अच्छा काम करता है। लेकिन जब भी qlineedit विजेट फोकस हो जाता है या माउस qlineedit पर क्लिक किया जाता है, तो डिफ़ॉल्ट पाठ छिप जाता है। मैं डिफॉल्ट टेक्स्ट को तब भी प्रदर्शित करना चाहता हूं जब कर्सर विजेट में इस स्थिति के साथ है कि कर्सर को तब तक नहीं ले जाना चाहिए जब तक कोई उपयोगकर्ता टाइप न हो। –

+0

ठीक है। Ui-> lineEdit-> setText ("") हटाएं; और ui-> lineEdit-> setEchoMode (QLineEdit :: पासवर्ड); on_lineEdit_selectionChanged() से।और ui-> lineEdit-> setEchoMode (QLineEdit :: पासवर्ड) जोड़ें; on_lineEdit_textEdited() – ScarCode

+0

@ user971306: मैंने अपने अपडेट किए गए उत्तर में कुछ कोड जोड़ा है। – Ammar

6

निर्माता में डाल

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

और on_lineEdit_selectionChanged() स्लॉट में, क्यूटी 5.0 में डाल

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

धन्यवाद spyke नहीं जानता। setPlaceholderText() विधि अच्छी काम करती है। लेकिन जब भी qlineedit विजेट फोकस हो जाता है या माउस qlineedit पर क्लिक किया जाता है, तो डिफ़ॉल्ट पाठ छिप जाता है। जब भी कर्सर विजेट में रहता है तब भी डिफॉल्ट टेक्स्ट प्रदर्शित करना चाहता है, जब तक कर्सर को तब तक स्थानांतरित नहीं किया जाना चाहिए जब तक कोई उपयोगकर्ता टाइप न हो .... –

2

प्रश्न 1 के लिए, और उच्च, setPlaceholderText आप क्या चाहते हैं नहीं करता है। https://codereview.qt-project.org/#change,45326

+0

लिंक में जो कुछ दिया गया है, कृपया यहां संक्षेप में वर्णन करें। अगर आप मदद करना चाहते हैं, तो आप इस लिंक को एक टिप्पणी में डाल सकते हैं। यह वास्तव में अभी एक जवाब की तरह नहीं दिखता है। – Rachcha

+0

मैं जोड़ता हूं कि 'setEchoMode (QLineEdit :: पासवर्ड)' QT 5.4 और उच्चतर – Shf

2

मैंने देखा कि इस प्रश्न में टैग पिक्ट है इसलिए मैं उस टैग से संबंधित वास्तविक उत्तर डालूंगा जो वास्तव में उन लोगों के लिए है जो सी ++ की बजाय एक अजगर तरीके की तलाश में हैं।

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

के बाद से 'setPlaceholderText' के साथ भी वास्तव में अच्छी तरह से काम करता है, यह मेरे लिए pyqt4 में पायथन 3.5 पर काम करता है, धन्यवाद –

+0

आपका स्वागत है! – answerSeeker

संबंधित मुद्दे