如何在只读期间在QLineEdit中显示闪烁的光标
How to display a blinking cursor in QLineEdit during read-only
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()
。
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 字符串-C++后显示的随机字符
- 继承期间显示未知行为的子类
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 程序崩溃并显示"std::out_of_range"错误
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 从数据库实时显示QT c++中的数据
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 显示错误输出的简单数组排序程序
- 处理闪烁窗口事件
- Qt自定义QPush按钮未显示在布局上
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 显示基于用户输入的整数的字符
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 如何在只读期间在QLineEdit中显示闪烁的光标
- CreateProcess正在调用cmd.exe,包括没有显示(闪烁)窗口的参数
- 如何在qt中显示闪烁的[动画]红色/绿色状态图标