「Qtのコントロール - ラインエディット」の版間の差分
編集の要約なし |
|||
113行目: | 113行目: | ||
== フォーカスイベント == | == フォーカスイベント == | ||
<code>QLineEdit</code>クラスには、<code>textChanged</code>シグナルや<code>textEdited</code>シグナルは存在するが、フォーカスに関係したシグナルが存在しない。<br> | |||
<br> | <br> | ||
例えば、エディットコントロールの初期表示において、"キーワードを入力してください..."等を表示して、フォーカスインで消去する場合、<br> | |||
Qt | <code>QLineEdit</code>クラスの<code>focusInEvent</code>メソッドおよび<code>focusOutEvent</code>メソッドをオーバーライドすることで実現できる。<br> | ||
<br> | |||
以下の例では、<code>QLineEdit</code>クラスを継承した派生クラスを作成して、フォーカスイベントを処理している。<br> | |||
Qt Designerで配置したラインエディットのコントロールは、<code>QLineEdit</code>クラスを継承した派生クラスに昇格させる。<br> | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
// QLineEditEx.cpp | // QLineEditEx.cpp |
2021年2月16日 (火) 11:36時点における版
概要
Qtのコントロールであるラインエディットについて記載する。
入力文字の確認
QValidatorクラスを使用する
入力文字を確認するには、QValidator
クラスを継承した派生クラスを作成して、以下の処理を記述する。
QValidator
クラスを継承した派生クラスを作成する。QValidator::validate
メソッドをオーバーライドして、確認処理を実装する。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
クラスを継承した派生クラスにて、以前の文字数を保存しておき、増加した文字数分の内容を全てを確認する。
フォーカスイベント
QLineEdit
クラスには、textChanged
シグナルやtextEdited
シグナルは存在するが、フォーカスに関係したシグナルが存在しない。
例えば、エディットコントロールの初期表示において、"キーワードを入力してください..."等を表示して、フォーカスインで消去する場合、
QLineEdit
クラスのfocusInEvent
メソッドおよびfocusOutEvent
メソッドをオーバーライドすることで実現できる。
以下の例では、QLineEdit
クラスを継承した派生クラスを作成して、フォーカスイベントを処理している。
Qt Designerで配置したラインエディットのコントロールは、QLineEdit
クラスを継承した派生クラスに昇格させる。
// QLineEditEx.cpp
#include "QLineEditEx.h"
QLineEditEx::QLineEditEx(QWigedt *parent) : QLineEdit(parent)
{
}
void QLineEditEx::focusInEvent(QFocusEvent *e)
{
QLineEdit::focusInEvent(e);
}
void QLineEditEx::focusOutEvent(QFocusEvent *e)
{
QLineEdit::focusOutEvent(e);
}
// QLineEditEx.h
#pragma once
#include <QWigedt>
#include <QLineEdit>
class QLineEditEx : public QLineEdit
{
Q_OBJECT
public:
explicit QLineEditEx(QWigedt *parent = nullptr);
protected:
void focusInEvent(QFocusEvent *) override;
void focusOutEvent(QFocusEvent *) override;
};
// MainWindow.cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"
MainWindow::MainWindow(QMainWindow *parent) : QMainWindow(parent), ui(new Ui::Widget)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
// MainWindow.h
#pragma once
#include <QMainWindow>
namespace Ui {class MainWindow;}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QMainWindow *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};