标题几乎说明了一切。我在表单上有一个只读文本框,用户可以在其中通过表单上的按钮编辑此文本框的内容。该表格基本上是键盘。当用户单击按钮时,数字将添加到文本框中的值。
从技术上讲,最终的应用程序将在没有键盘但有触摸屏的机器上运行。用户使用触摸屏与应用程序进行交互,因此他们不应该在计算机上安装键盘,但是如果这样做,我会将文本框设置为只读。
现在,即使文本框是只读的,我如何仍使它的光标闪烁呢?
我想知道是否需要执行与此用户的解决方案类似的操作:
Hide QLineEdit blinking cursor
我也尝试过使用setFocus方法,并且正在研究样式表。但是,什么都没有解决。
答案 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
,或者是QIntvalidator
或QRegExpValidator
。然后,您可以让用户使用键盘,但他们只能输入数字,就像使用虚拟键盘一样。