【问题标题】:QlineEdit with some default text for which cursor should not be moved?QlineEdit 带有一些不应移动光标的默认文本?
【发布时间】:2012-05-27 16:12:16
【问题描述】:

在 QT 中,创建的 lineEdit 使用 setText() 方法显示文本。

  1. 但默认文本的光标是可移动的。我希望光标对于默认文本不应该是可移动的。

  2. 我的lineEdit 类型已设置为密码。因此,默认文本(“密码”)也显示为“********”。每当用户键入类型必须更改为密码并且没有文本或直到用户没有键入任何文本时,lineEdit 应显示纯文本“密码”

有解决上述两个问题的想法吗?

【问题讨论】:

    标签: qt user-interface pyqt qlineedit


    【解决方案1】:

    在构造函数中放

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

    然后在on_lineEdit_selectionChanged() SLOT,放

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

    【讨论】:

    • 感谢斯派克。 setPlaceholderText() 方法效果很好。但是,每当 qlineedit 小部件获得焦点或鼠标单击 qlineedit 时,默认文本都会被隐藏。即使光标在小部件中,我也想显示默认文本,条件是在用户键入任何文本之前不应移动光标......
    【解决方案2】:

    我注意到这个问题有标签 pyqt,所以我会为那些真正寻找 python 方式而不是 c++ 的人提供与该标签相关的实际答案。

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

    【讨论】:

      【解决方案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);
              }
          }
      }
      

      我写得非常仓促,只是为了给你看。自己进行测试,并随时指出任何错误或优化。希望这会有所帮助。

      【讨论】:

      • setPlaceholderText() 方法效果很好。但是,每当 qlineedit 小部件获得焦点或鼠标单击 qlineedit 时,默认文本都会被隐藏。即使光标在小部件中,我也想显示默认文本,条件是在用户键入任何文本之前不应移动光标。
      • 好的。移除 ui->lineEdit->setText("");和 ui->lineEdit->setEchoMode(QLineEdit::Password);来自 on_lineEdit_selectionChanged()。并添加 ui->lineEdit->setEchoMode(QLineEdit::Password);在 on_lineEdit_textEdited()
      • @Ammar :当我的默认文本颜色为灰色时,我可以将我的 lineedit 光标颜色设置为黑色吗?有可能吗?
      • @user971306:如果你看到QLineEdit::paintEvent()的源代码,你会注意到光标是使用QTextLayout::drawCursor()函数绘制的,它使用QPainter中的当前笔组,即text-color .所以你可以覆盖paintEvent()并在绘制光标之前设置适当的pen-color..有点棘手..:)
      • 任何python方式?我真的不懂c++
      【解决方案4】:

      对于问题 1,在 Qt 5.0 及更高版本中,setPlaceholderText 可以满足您的需求。 https://codereview.qt-project.org/#change,45326

      【讨论】:

      • 请在此处简要描述链接中给出的内容。如果您想提供帮助,可以将此链接放在评论中。这看起来不像现在的答案。
      • 我要补充一点,setEchoMode(QLineEdit::Password) 也适用于 setPlaceholderText,因为 Qt 5.4 及更高版本也是如此
      猜你喜欢
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多