只读期间

时间:2019-06-05 21:00:41

标签: c++ qt user-interface

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

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

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

我想知道是否需要执行与此用户的解决方案类似的操作:

Hide QLineEdit blinking cursor

我也尝试过使用setFocus方法,并且正在研究样式表。但是,什么都没有解决。

3 个答案:

答案 0 :(得分:1)

罗姆·科列夫(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()

答案 1 :(得分:1)

创建一个继承自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();

答案 2 :(得分:0)

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

让我们从头开始思考。接受键盘输入的问题是什么? 从您的问题中,我敢于猜测您要确保QLineEdit仅接受数字,并禁止用户输入其他字符。

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