首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt QSpinbox在设置范围后接受“+”符号

Qt QSpinbox在设置范围后接受“+”符号
EN

Stack Overflow用户
提问于 2018-09-21 04:16:24
回答 1查看 230关注 0票数 2

我有一个QSpinbox,它的范围是:

代码语言:javascript
复制
QSpinBox *SpinBox = new QSpinBox;
SpinBox->setRange(0, 100);

但是,我能够手动输入一个没有反映在我的插槽中的+标志。

代码语言:javascript
复制
connect (SpinBox, SIGNAL (valueChanged (QString)), this,
            SLOT (onSpinBoxChanged (QString)));

我也试着用int代替int。但是+没有反映在插槽中。

如何限制进入+标志?

我已经参考了一些Qt和StackOverflow的帖子/答案,这些文章/答案是禁用尖端盒中的行编辑:

我试着使尖端盒的行编辑ReadOnly,但我无法这样做,因为它是一个const变量。

一些答案建议继承QSpinbox类。

是否有其他方法来限制+标志或禁用QSpinbox的行编辑本身?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-21 04:39:52

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

代码语言:javascript
复制
#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

代码语言:javascript
复制
...
class QSpinBox;

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

*.cpp

代码语言:javascript
复制
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);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52436531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档