gpt4 book ai didi

c++ - 当输入大于最大值的值时,如何将 QSpinBox 的值设置为最大值?

转载 作者:搜寻专家 更新时间:2023-10-31 02:07:34 27 4
gpt4 key购买 nike

Qt 的 SpinBox 小部件的默认行为对我的应用程序来说是非常不受欢迎的。如果最大值为 998,并且用户尝试键入“999”,则 SpinBox 将获得 99 的值,这与用户想要的相去甚远。

在这种情况下,是否有一个选项或替代小部件会取而代之获取 998 的值?

编辑:好的,我已经开始通过子类化方法处理它,但它并没有像预期的那样工作。

头文件:

// myspinbox.h

#ifndef MYSPINBOX_H
#define MYSPINBOX_H


#include <QSpinBox>
#include <QValidator>

class MySpinBox : public QSpinBox
{
Q_OBJECT

public:
explicit MySpinBox(QWidget *parent = Q_NULLPTR);

// QValidator::State validate(QString &text, int &pos) const override;

void fixup(QString &input) const override;
};

#endif // MYSPINBOX_H

源文件:

// myspinbox.cpp

#include <QtWidgets>
#include <iostream>
#include "myspinbox.h"

MySpinBox::MySpinBox(QWidget *parent) : QSpinBox(parent) {}

//QValidator::State MySpinBox::validate(QString &text, int &pos) const {
// return QValidator::Acceptable;
//}

void MySpinBox::fixup(QString &input) const {
std::cout << "fixup called on input: " << input.toStdString() << std::endl;
int int_val = input.toInt();
int max_val = this->maximum();
if (int_val > max_val) {
input = QString::number(max_val);
std::cout << "Max val is " << max_val << std::endl;
}
}

永远不会显示消息 fixup called on input...


QSpinBox源码,有个函数QVariant QSpinBoxPrivate::validateAndInterpret(QString &input, int &pos, QValidator::State &state) const 如果输入值不在允许范围内,第 1045 到 1050 行调整输入值。我不确定给定的覆盖 fixup 的建议是否有效。

最佳答案

子类 QSpinBox 重写这两个方法:

  1. QValidator::State QSpinBox::validate(QString &text, int &pos) const
  2. void QAbstractSpinBox::fixup(QString &input) const

请注意,您不想让用户在文本编辑中可以输入的内容受到过强的限制,因此请仔细测试并考虑用户在不同情况下的感受。

这是使用 C++11 的代码示例:

class AltSpinBox : public QSpinBox
{
Q_OBJECT
public:
using QSpinBox::QSpinBox;

protected:
void fixup(QString &input) const;
QValidator::State validate(QString &text, int &pos) const;
};

void AltSpinBox::fixup(QString &input) const
{
auto isOk = false;
auto value = input.toInt(&isOk, displayIntegerBase());
if (isOk) {
value = qBound(minimum(), value, maximum());
input = QString::number(value, displayIntegerBase());
} else {
QSpinBox::fixup(input);
}
}

QValidator::State AltSpinBox::validate(QString &text, int &pos) const
{
auto isOk = false;
auto value = text.toInt(&isOk, displayIntegerBase());
if (isOk) {
if (value >= minimum() && value <= maximum())
return QValidator::Acceptable;
return QValidator::Intermediate;
} else {
return QSpinBox::validate(text, pos);
}
}

我已经对其进行了测试,它可以正常工作。可能您想稍微调整一下。

关于c++ - 当输入大于最大值的值时,如何将 QSpinBox 的值设置为最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48481279/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com