我正在设计一个C ++ / Qt应用程序。我在法国Windows环境下使用法语键盘。
当我尝试在QDoubleSpinBox控件中输入一个十进制数字时,按下数字小键盘按钮什么都不做......我希望它能插入小数分隔符!
这是一个非常简单的Qt程序隔离问题:
main.cpp中:
#include <QApplication>
#include <QVBoxLayout>
#include <QLabel>
#include <QSpinBox>
#include <QDialog>
class Dialog : public QDialog
{
public:
Dialog()
{
QVBoxLayout* layout = new QVBoxLayout( this );
layout->addWidget( new QLabel( QLocale().toString( 3.14 ), this ) );
layout->addWidget( new QDoubleSpinBox( this ) );
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}
我在法国PC上用Visual Studio 2010和5.2.1编译它。
对话框打开时:
然后:
我正在寻找一个全新的解决方案(在QApplication级别),而不是在QSpinBox级别,因为我的原始项目中有很多这样的解决方案。
答案 0 :(得分:2)
在https://bugreports.qt.io/browse/QTBUG-41256被修复之前,解决方案是应用程序全局事件过滤器,以便任何使用'。'。在默认语言环境使用“,”作为小数点分隔符的系统上,数字键盘上(仅在那儿)的键被转换为“,”。
class GlobalEventFilter : public QObject
{
public:
explicit GlobalEventFilter(QObject *parent) : QObject(parent) {}
bool eventFilter(QObject *obj, QEvent *ev) override {
if (ev->type() == QEvent::KeyPress || ev->type() == QEvent::KeyRelease) {
QKeyEvent *kev = static_cast<QKeyEvent *>(ev);
if (kev->key() == Qt::Key_Period && (kev->modifiers() & Qt::KeypadModifier)) {
QChar decimalPoint = QLocale().decimalPoint();
if (decimalPoint == QLatin1Char(',')) {
QKeyEvent modifiedKeyEvent(kev->type(), Qt::Key_Comma, kev->modifiers(), QString(decimalPoint), kev->isAutoRepeat(), kev->count());
qApp->sendEvent(obj, &modifiedKeyEvent);
return true;
}
}
}
return false;
}
};
然后在您的main()
中添加qApp->installEventFilter(new GlobalEventFilter(qApp));
。
我对此进行了测试以在法国Linux系统上工作。
答案 1 :(得分:0)
我相信你应该使用QDoubleSpinBox而不是QSpinBox。作为QSpinBox州的文档:
使用QDoubleSpinBox获取浮点值。
从QDoubleSpinBox::textFromValue
可以看到只要需要显示给定值,旋转框就会使用此虚函数。默认实现返回一个字符串,其中包含使用QWidget :: locale()。toString(value,QLatin1Char(&#39; f&#39;),decimals())打印的值,并将删除千位分隔符。