c++ - Qt QSpinbox 在设置范围后接受 '+' 符号

标签 c++ qt qt5 qspinbox

我有一个QSpinbox,我正在设置其范围:

QSpinBox *SpinBox = new QSpinBox;
SpinBox->setRange(0, 100);

但是,我可以手动输入 + 符号,但该符号未反射(reflect)在我的插槽中。

connect (SpinBox, SIGNAL (valueChanged (QString)), this,
            SLOT (onSpinBoxChanged (QString)));

我也尝试用 int 替换 QString 。但是 + 没有反射(reflect)在槽中。

如何限制输入 + 符号?

我引用了一些关于禁用旋转框中的行编辑的 Qt 和 StackOverflow 帖子/答案:

我尝试将旋转框的行编辑设置为ReadOnly,但我无法这样做,因为它是一个const变量。

一些答案​​建议继承QSpinbox类。

是否有其他方法可以限制 + 符号或禁用 QSpinbox 的行编辑本身?

最佳答案

如果您不想继承QSpinBox类,一个可能的解决方案是使用eventFilter,在下面的代码中我展示了一个示例:

#include <QApplication>
#include <QSpinBox>
#include <QLineEdit>
#include <QKeyEvent>

class PlusRemoveHelper: public QObject{
public:
    using QObject::QObject;
    void addWidget(QWidget *widget){
        if(widget){
            widgets.append(widget);
            widget->installEventFilter(this);
        }
    }
public:
    bool eventFilter(QObject *watched, QEvent *event) override
    {
        if(std::find(widgets.begin(), widgets.end(), watched) != widgets.end()
                && event->type() == QEvent::KeyPress){
            QKeyEvent *keyevent = static_cast<QKeyEvent *>(event);
            if(keyevent->text() == "+")
                return true;
        }
        return  QObject::eventFilter(watched, event);
    }
private:
    QWidgetList widgets;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QSpinBox w;
    w.setRange(0, 100);
    PlusRemoveHelper helper;
    helper.addWidget(&w);
    w.show();

    return a.exec();
}

如果您在小部件内,则可以实现相同的逻辑:

*.h

...
class QSpinBox;

class SomeClass: public SuperClass
{
...
public:
    bool eventFilter(QObject *watched, QEvent *event);
private:
    ...
    QSpinBox *SpinBox
};

*.cpp

SomeClass::SomeClass(...):
  SuperClass(..)
{
    SpinBox = new QSpinBox;
    SpinBox->setRange(0, 100);
    SpinBox->installEventFilter(this):
}


bool SomeClass::eventFilter(QObject *watched, QEvent *event){
    if(watched == SpinBox && event->type() == QEvent::KeyPress){
        QKeyEvent *keyevent = static_cast<QKeyEvent *>(event);
        if(keyevent->text() == "+")
            return true;
    }
    return  SomeClass::eventFilter(watched, event);
}

关于c++ - Qt QSpinbox 在设置范围后接受 '+' 符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52436531/

相关文章:

c++ - 意外行为字符串文字

c++ - 防止 QSettings 将组织名称添加到 QSettings::setPath() 设置的路径中

c++ - 在 C++ 中为函数计时

c++ - 在另一个概念的 'requires' 子句中使用一个概念

c++ - Qt:windows函数是未解析的外部符号

c++ - 来自变量的 QJsonObject 部分路径

c++ - QtQuick、动态图像和 C++

c++ - 可变参数模板和顶点缓冲区属性

c++ - 直接使用 C++ WinRT 组件或 C++ XAML 项目是否存在任何性能问题?

linux - 如何在 Windows 中从 Linux 加载 Qt 项目