QLineEdit 带有一些不应移动光标的默认文本?

问题描述 投票:0回答:4

在 Qt 中,创建的

lineEdit
使用
setText()
方法显示文本。

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

  2. 我的

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

有办法解决以上两个问题吗? enter image description here

qt user-interface pyqt qlineedit
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);

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

我写得很匆忙,只是为了给你们看。自己测试一下,并随时指出任何错误或优化。希望这有帮助。


4
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.