入力文字のチェックにはQValidatorを使用する
- QValidatorを継承したクラスを作成
- QValidator::validate()関数をオーバーライドしてチェック処理を実装
- QLineEdit::setValidator()関数で、上記クラスのオブジェクトをセット
という流れになります。
サンプル
デザインはQLineEdit貼ったのみ。
コード。
簡略化のため、QWidget.cpp/QWidget.hの中にvalidatorを書いていますが、別ファイル化することをお勧めします。
#include "widget.h" #include "ui_widget.h" HalfKanaValidator::HalfKanaValidator(QObject *parent) : QValidator(parent) { } QValidator::State HalfKanaValidator::validate(QString &text, int &pos) const { if (!text.isEmpty() && (pos > 0)) { ushort ch = text.at(pos - 1).unicode(); // 半角カナ判定 if (ch >= 0xFF61 && ch <= 0xFF9F) { return Invalid; } } return Acceptable; } Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); ui->lineEdit->setValidator(new HalfKanaValidator(this)); } Widget::~Widget() { delete ui; }
#ifndef WIDGET_H #define WIDGET_H #include <QValidator> #include <QWidget> namespace Ui { class Widget; } class HalfKanaValidator : public QValidator { public: explicit HalfKanaValidator(QObject *parent = nullptr); State validate(QString &, int &) const override; }; class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = nullptr); ~Widget(); private: Ui::Widget *ui; }; #endif // WIDGET_H
実行し、ラインエディットに半角カナを入力すると、IMEの変換でEnter確定しても、ラインエディットに入力されません。
注意点
上記の方法は、ラインエディット上に直接キーボードから入力する分には問題ないのですが、コピペには対応できません。
例えば「アアあ」とコピペ入力した場合、validate()関数の引数は、以下の様になります。
第一引数(text):アアあ
第二引数(pos):3
このため、コピペした文字列の最後の文字が半角カナであれば弾くことができますが、例のように最後の文字が半角カナ以外の場合は弾くことが出来ません。
また、validate()関数の引数からは、コピペされた文字列や文字数が分かりません。
例えば「123」と入力済みの状態から、「1」と「2」の間に「アアあ」をコピペした場合、
第一引数(text):1アアあ23
第二引数(pos):4
となり、どこにコピペされたかは分かるものの、何文字コピペされたかが分かりません。
なので、
- QLineEditをコピペ不可にする
- QValidatorで前回の文字数を保存しておき、増えた文字数分全てをチェックする
などの対策が必要となります。