Qtのコントロール - ラインエディット

提供:MochiuWiki : SUSE, EC, PCB
2021年2月15日 (月) 23:19時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == Qtのコントロールであるラインエディットについて記載する。<br> <br><br> == 入力文字の確認 == ==== QValidatorクラスを使…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

概要

Qtのコントロールであるラインエディットについて記載する。


入力文字の確認

QValidatorクラスを使用する

入力文字を確認するには、QValidatorクラスを継承した派生クラスを作成して、以下の処理を記述する。

  1. QValidatorクラスを継承した派生クラスを作成する。
  2. QValidator::validateメソッドをオーバーライドして、確認処理を実装する。
  3. QLineEdit::setValidatorメソッドを使用して、派生クラスのオブジェクトを代入する。


以下の例では、ラインエディット(QLineEditクラス)とQValidatorクラスを継承した派生クラスを使用して、半角カナを入力不可としている。

 // MainWindow.cpp
 
 #include "MainWindow.h"
 #include "ui_MainWindow.h"
 #include "HalfKanaValidator.h"
 
 MainWindow::MainWindow(QMainWindow *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
 {
    ui->setupUi(this);
    ui->lineEdit->setValidator(new HalfKanaValidator(this));
 }
 
 MainWindow::~MainWindow()
 {
    delete ui;
 }


 // MainWindow.h
 
 #pragma once
 
 #include <QValidator>
 #include <QMainWindow>
 
 namespace Ui {class MainWindow;}
 
 class MainWindow : public QMainWindow
 {
    Q_OBJECT
 
 public:
    explicit MainWindow(QMainWindow *parent = nullptr);
    ~MainWindow();
 
 private:
    Ui::MainWindow *ui;
 };


 // HalfKanaValidator.cpp
 
 #include "HalfKanaValidator.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;
 }


 // HalfKanaValidator.h
 
 #include <QValidator>
 
 class HalfKanaValidator : public QValidator
 {
 public:
    explicit HalfKanaValidator(QObject *parent = nullptr);
    QValidator::State validate(QString &, int &) const override;
 };


ただし、上記のサンプルコードでは、コピー&ペーストに対応できない。
例えば、アアあという文字列をコピー&ペーストする場合、validateメソッドの引数には、以下の値が代入される。

  • 第1引数 QString &text
    アアあ
  • 第2引数 int &pos
    3


また、validateメソッドの引数からは、コピー&ペーストされた文字列の内容や文字数は不明となる。
例えば、"12"と入力済みの状態から、"1"と"2"の間に"アアあ"をコピーする場合、validateメソッドの引数には、以下の値が代入される。
コピーした場所は判別できるが、何文字コピーされたかは不明となる。

  • 第1引数 QString &text
    1アアあ2
  • 第2引数 int &pos
    4


そのため、以下のような対策が必要となる。

  • ラインエディットに対するコピー&ペーストを不可にする。
  • QValidatorクラスを継承した派生クラスにて、以前の文字数を保存しておき、増加した文字数分の内容を全てを確認する。