如何使用法语键盘的点键(数字键盘)作为Qt的输入?

时间:2014-09-10 10:40:42

标签: c++ qt keyboard

我正在设计一个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编译它。

对话框打开时:

enter image description here

然后:

  • QLabel显示“3,14”,这意味着正确使用法语QLocale(否则,它将显示3.14,英语默认值)。行
  • QDoubleSpinBox显示“0,00”。行
  • 我可以使用','标准键盘键在spinbox中键入一个十进制值。行
  • 我无法使用'。'在spinbox中输入小数值。标准键盘键。行
  • 但是当我按下数字法语键盘上的圆点键时,没有任何反应!这应该输入一个小数点分隔符,无论使用何种语言环境设置!

我正在寻找一个全新的解决方案(在QApplication级别),而不是在QSpinBox级别,因为我的原始项目中有很多这样的解决方案。

2 个答案:

答案 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())打印的值,并将删除千位分隔符。