Qt QSpinbox 在设置范围后接受'+'符号
Qt QSpinbox accepting '+' symbol after setting range
我有一个QSpinbox
,我设置的范围是:
QSpinBox *SpinBox = new QSpinBox;
SpinBox->setRange(0, 100);
但是,我可以手动输入一个 +
符号,但我的插槽中没有反映出来。
connect (SpinBox, SIGNAL (valueChanged (QString)), this,
SLOT (onSpinBoxChanged (QString)));
我也尝试用 int
替换 QString
。但是+
并没有体现在插槽中。
如何限制输入 +
符号?
我参考了一些 Qt 和 Whosebug posts/answers 禁用旋转框中的行编辑:
我试图对旋转框进行行编辑 ReadOnly
但我无法这样做,因为它是一个 const
变量。
一些答案建议继承 QSpinbox
class。
是否有任何其他方法来限制 +
标志或禁用 [=12=] 的行编辑本身?
如果您不想从 QSpinBox
class 继承,一个可能的解决方案是使用 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);
}
我有一个QSpinbox
,我设置的范围是:
QSpinBox *SpinBox = new QSpinBox;
SpinBox->setRange(0, 100);
但是,我可以手动输入一个 +
符号,但我的插槽中没有反映出来。
connect (SpinBox, SIGNAL (valueChanged (QString)), this,
SLOT (onSpinBoxChanged (QString)));
我也尝试用 int
替换 QString
。但是+
并没有体现在插槽中。
如何限制输入 +
符号?
我参考了一些 Qt 和 Whosebug posts/answers 禁用旋转框中的行编辑:
我试图对旋转框进行行编辑 ReadOnly
但我无法这样做,因为它是一个 const
变量。
一些答案建议继承 QSpinbox
class。
是否有任何其他方法来限制 +
标志或禁用 [=12=] 的行编辑本身?
如果您不想从 QSpinBox
class 继承,一个可能的解决方案是使用 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);
}