如何在只读期间在QLineEdit中显示闪烁的光标



title几乎说明了一切。我在窗体上有一个只读文本框,用户可以通过窗体上的按钮编辑此文本框的内容。该表单基本上是一个键盘。当用户单击按钮时,文本框中的值将添加一个数字。

从技术上讲,最终应用程序将在没有键盘但有触摸屏的机器上运行。用户使用触摸屏与应用程序交互,他们不应该在机器上安装键盘,但如果他们这样做,我将文本框设置为只读。

现在,如何让文本框的光标即使它是只读的仍然闪烁?

我想知道我是否需要做一些类似于该用户解决方案的事情:

隐藏 QLine编辑闪烁的光标

我也尝试使用setFocus方法,我正在研究样式表。然而,没有任何结果。

其他答案为您的问题提供了技术解决方案。但是,我认为你走错了方向。你想要一个只读的QLineEdit,但带有光标,仍然接受来自虚拟键盘的输入...是的,所以它不是真正的只读...它闻起来不好闻。一般来说,任意和主动禁用标准功能不是一个好主意。特别是,如果这意味着绕过标准小部件行为,那么语义就可以做到这一点。

让我们从头开始思考。接受来自键盘的输入有什么问题?从你的问题中,我敢猜测你想确保QLineEdit只接受数字,并禁止用户输入其他字符。

如果我是对的,你想要的是一个QValidator,要么是QIntvalidator,要么是QRegExpValidator。然后,您可以让用户使用键盘,但他们只能输入数字,就像使用虚拟键盘一样。

创建一个从

QLineEdit继承的类,并忽略键事件(用户按下键时触发的事件(。它将使您的行编辑只读,但没有外观:

class LineEdit: public QLineEdit
{
    Q_OBJECT
public:
    LineEdit(QWidget* parent=nullptr): QLineEdit(parent)
    {
    }
    virtual void keyPressEvent(QKeyEvent* event)
    {
        event->ignore();
    }
public slots:
    void add(QString const& textToAdd)
    {
        setText(text() + textToAdd);
    }
};

使用示例(计时器模拟虚拟键盘(:

LineEdit* line = new LineEdit;
line->show();
QTimer timer;
timer.setInterval(2000);
QObject::connect(&timer, &QTimer::timeout, [=]() { line->add("a"); });
timer.start();

Romha Korev的答案似乎有效,但它不会涵盖所有内容。仍然可以将文本粘贴或拖放到行编辑中,或者作为与区域设置相关的输入法键盘事件的结果。我不知道文本最终以这种方式输入行编辑的所有各种方式。你会寻找要堵塞的洞。

所以我建议为此滥用QValidator。不要将行编辑设置为只读模式。创建您自己的验证器,阻止所有输入,除非您特别禁用它:

class InputBlockerValidator final: public QValidator
{
    Q_OBJECT
public:
    void enable()
    { is_active_ = true; }
    void disable()
    { is_active_ = false; }
    QValidator::State validate(QString& /*input*/, int& /*pos*/) const override
    {
        if (is_active_) {
            return QValidator::Invalid;
        }
        return QValidator::Acceptable;
    }
private:
    bool is_active_ = true;
};

现在设置一个实例作为行编辑的验证器:

// ...
private:
    QLineEdit lineedit_;
    InputBlockerValidator validator_;
// ...
lineedit_.setValidator(&validator_);

然后,每当在行编辑中插入文本时,禁用并重新启用验证器:

validator_.disable();
lineedit_.insert(text_to_be_inserted);
validator_.enable();

永远不要在行编辑中调用setText()。出于某种原因,这会永久阻止验证器阻止输入。我不知道这是有意的还是Qt错误。仅使用insert() .要模拟setText(),请使用clear()后跟insert()

最新更新