QlineEdit带有一些默认文本,光标不应该被移动?

10

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

  1. 但是默认文本的光标是可移动的。我希望默认文本的光标不能移动。

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

有什么解决上述两个问题的方法吗? enter image description here

4个回答

15
在构造函数中放置。
ui->lineEdit->setPlaceholderText("password");
ui->lineEdit->setReadOnly(1);

on_lineEdit_selectionChanged()槽函数中,放置

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

谢谢Spyke。setPlaceholderText()方法很好用。但是每当qlineedit小部件获得焦点或鼠标单击qlineedit时,默认文本就会隐藏。我希望在光标位于小部件中时显示默认文本,条件是在用户键入任何文本之前不移动光标... - Mathan Kumar

9

我注意到这个问题有PyQt的标签,因此我会提供一个与该标签相关的实际答案,供那些真正寻找Python方式而不是C++的人参考。

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

5

我通过以下方式从 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 时,默认文本会被隐藏。我希望在光标位于小部件中时显示默认文本,条件是在用户键入任何文本之前不应移动光标。 - Mathan Kumar
好的。请从on_lineEdit_selectionChanged()中删除ui->lineEdit->setText("");和ui->lineEdit->setEchoMode(QLineEdit::Password);。然后在on_lineEdit_textEdited()中添加ui->lineEdit->setEchoMode(QLineEdit::Password);。 - ScarCode
@Ammar:当我的默认文本颜色为灰色时,我能否将我的行编辑器光标颜色设置为黑色?这是否可能? - Mathan Kumar
如果您查看 QLineEdit::paintEvent() 的源代码,您会注意到光标是使用 QTextLayout::drawCursor() 函数绘制的,该函数使用在 QPainter 中设置的当前笔,即 text-color。因此,在绘制光标之前,您可以覆盖该 paintEvent() 并设置适当的 pen-color。有点棘手.. :) - Ammar
有Python的方法吗?我不太懂C++。 - answerSeeker

4

请在此简要描述链接中提供的内容。如果您想帮忙,可以在评论中放置此链接。现在这看起来并不像一个答案。 - Rachcha
我想补充一下,自Qt 5.4及以上版本,setEchoMode(QLineEdit::Password)setPlaceholderText也非常配合地使用。 - Shf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接