如何允许QSpinBox在装满时插入
How to allow QSpinBox to insert when full?
我尝试过以各种方式搜索这个问题,但没有找到任何相关的东西,所以也许有一种简单的方法可以解决这个问题,我根本没有找到。如果是,我提前道歉。
我在我的应用程序中使用了许多QSpinBoxes,它们的行为让我感到非常沮丧,也就是说,如果你插入光标并尝试键入,它会被阻止,并且什么都没有插入。如果我删除一个字符,那么我可以键入一个字符等等
示例:
Spinbox显示:0.0000
我将光标插入"."之后并且想要键入"5",即它将具有0.50000。考虑到我在限制和精度方面设置的约束,这是被阻止的,因为旋转框已满。我必须按Delete删除一个"0",所以它显示0.000,然后我可以键入我的"5"。
如何让spinbox在输入时接受所有有效的输入,而只担心在最后截断值?
您可能可以将QDdoubleSpinBox子类化,并重新实现其验证方法,以允许使用更多小数点的数字。
然后捕获editingFinished信号以截断输入的值。
正如在另一个问题中提到的,我认为只有一种方法可以通过重写QDoubleSpinBox::validate
类来实现这一点。
示例实现:
QValidator::State DoubleSpinBox::validate(QString& input, int& pos) const
{
//support prefix & suffix
const int decimalPointIndex = input.indexOf(locale().decimalPoint());
if(decimalPointIndex != -1 && decimalPointIndex < pos)
{
//Find last not digit
const auto lastNotDigitIt =
std::find_if_not(input.begin() + decimalPointIndex + 1,
input.end(),
[](const auto& item) { return item.isDigit(); });
const int lastNotDigitIndex = std::distance(input.begin(), lastNotDigitIt);
//Check should we trim input to desired decimals
const int extraDigits = (lastNotDigitIndex - 1 - decimalPointIndex) - decimals();
if(extraDigits > 0 && lastNotDigitIndex != decimalPointIndex)
{
QString copy = input;
//trim
input.erase(lastNotDigitIt - extraDigits, lastNotDigitIt);
}
}
return QDoubleSpinBox::validate(input, pos);
}
若你们需要在Designer工具中使用这样的类,你们只需要提升你们的小部件。(相当简单)
相关文章:
- 叮叮当当在修复时插入多个"覆盖"说明符
- 磁盘已满时,Boost日志崩溃
- QTCPSOCTED数据传输在读取缓冲区已满时停止,并且在释放时不会恢复
- 使用 std::move 在开始时插入矢量的中间元素不起作用
- 使用EasyLogging 记录QString时插入额外的空间
- 当TCP TX缓冲区填满时,boost::asio中会发生什么
- 在链表运行时插入节点错误
- 我们可以在穿越时插入STL列表吗?
- 在插入时插入std :: MAP中的模板类
- 当接收缓冲区几乎满时,阻止UDP数据包被部分截断
- 编写一个C++ pgm 以从文件"input.txt"读取,每当遇到句点时插入换行符并将修改的内容写入"output.txt"
- 排序的链表在每次执行时插入重复项
- 如何允许QSpinBox在装满时插入
- 如何在执行 gdb 时插入断点
- 文件处理,在复制内容时插入ÿ字符
- 缓冲区已满时清除字符串缓冲区.这是什么图案
- QWidget::insertAction尝试在运行时插入null操作
- C++-静态列表,当节点满时从头部弹出
- C++宏,必要时插入typename
- 当底部4GB已满时,FileDialog崩溃