MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
Qtのコントロール - ラインエディットのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
Qtのコントロール - ラインエディット
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == Qtのコントロールであるラインエディットについて記載する。<br> <br><br> == テキストの入力 == <syntaxhighlight lang="c++"> QString str = ""; // ...略 if(!str.isEmpty()) { lineEdit->setText(str); } </syntaxhighlight> <br><br> == テキストの取得 == <syntaxhighlight lang="c++"> QString str = lineEdit->text(); </syntaxhighlight> <br><br> == パスワード入力モードにする == Qt Designerのプロパティ[echoMode]を[Password]に設定する。<br> または、ソースコードで以下を記述する。<br> <syntaxhighlight lang="c++"> lineEdit->setEchoMode(QLineEdit::Password) </syntaxhighlight> <br><br> == 入力文字の確認 == ==== QValidatorクラスを使用する ==== 入力文字を確認するには、<code>QValidator</code>クラスを継承した派生クラスを作成して、以下の処理を記述する。<br> # <code>QValidator</code>クラスを継承した派生クラスを作成する。 # <code>QValidator::validate</code>メソッドをオーバーライドして、確認処理を実装する。 # <code>QLineEdit::setValidator</code>メソッドを使用して、派生クラスのオブジェクトを代入する。 <br> 以下の例では、ラインエディット(<code>QLineEdit</code>クラス)と<code>QValidator</code>クラスを継承した派生クラスを使用して、半角カナを入力不可としている。<br> <syntaxhighlight lang="c++"> // 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; } </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // 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; }; </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // 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; } </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // HalfKanaValidator.h #include <QValidator> class HalfKanaValidator : public QValidator { public: explicit HalfKanaValidator(QObject *parent = nullptr); QValidator::State validate(QString &, int &) const override; }; </syntaxhighlight> <br> ただし、上記のサンプルコードでは、コピー&ペーストに対応できない。<br> 例えば、<code>アアあ</code>という文字列をコピー&ペーストする場合、<code>validate</code>メソッドの引数には、以下の値が代入される。<br> * 第1引数 QString &text *: アアあ * 第2引数 int &pos *: 3 <br> また、<code>validate</code>メソッドの引数からは、コピー&ペーストされた文字列の内容や文字数は不明となる。<br> 例えば、"12"と入力済みの状態から、"1"と"2"の間に"アアあ"をコピーする場合、<code>validate</code>メソッドの引数には、以下の値が代入される。<br> コピーした場所は判別できるが、何文字コピーされたかは不明となる。<br> * 第1引数 QString &text *: 1アアあ2 * 第2引数 int &pos *: 4 <br> そのため、以下のような対策が必要となる。<br> * ラインエディットに対するコピー&ペーストを不可にする。 * <code>QValidator</code>クラスを継承した派生クラスにて、以前の文字数を保存しておき、増加した文字数分の内容を全てを確認する。 <br><br> == 貼り付けを無効にする == キーボード入力以外の入力方法として、ラインエディットに文字列を入力するには、以下の方法がある。<br> * コンテキストメニュー(右クリックメニュー)から貼り付ける。 * 文字列を選択してドラッグ&ドロップする。 * [Ctrl] + [V]キーで貼り付ける。 <br> 上記の方法を無効化する方法を以下に示す。<br> * コンテキストメニューの無効化 *: Qt Designerにて、<code>contextMenuPolicy</code>プロパティの値をを<code>NoContextMenu</code>にする。 *: また、ソースコードにて以下を記述する。 *: <code>setContextMenuPolicy(Qt::NoContextMenu);</code> *: 無効にしない場合、値を<code>NoContextMenu</code>ではなく<code>CustomContextMenu</code>にして、独自のコンテキストメニューを作成してもよい。 *: <br> * ドラッグ&ドロップの無効化 *: Qt Designerにて、<code>acceptDrops</code>プロパティのチェックボックスからチェックを外す。 *: また、ソースコードにて以下を記述する。 *: <code>setAcceptDrops(false);</code> *: <br> * [Ctrl] + [V]キーの無効化 *: <code>QLineEdit::keyPressEvent</code>メソッドをオーバーライドする。 <br> 以下の例では、ラインエディットを<code>QLineEdit</code>クラスを継承した派生クラス<code>QLineEditEx</code>クラスに昇格している。<br> また、ラインエディットの<code>contextMenuPolicy</code>プロパティの値を<code>acceptDrops</code>に設定している。<br> <br> 押下されたキーの組み合わせが貼り付けに該当する場合、該当イベントを無視するようにしている。<br> <syntaxhighlight lang="c++"> // QLineEditEx.cpp #include "QLineEditEx.h" QLineEditEx::QLineEditEx(QWigedt *parent) : QLineEdit(parent) { } void QLineEditEx::keyPressEvent(QKeyEvent *event) { if(event->matches(QKeySequence::Paste)) { event->ignore(); } else { return QLineEdit::keyPressEvent(event); } } </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // QLineEditEx.h #pragma once #include <QWigedt> #include <QLineEdit> #include <QKeyEvent> class QLineEditEx : public QLineEdit { Q_OBJECT public: explicit QLineEditEx(QWigedt *parent = nullptr); protected: void keyPressEvent(QKeyEvent *) override; }; </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // 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; } </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // 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; }; </syntaxhighlight> <br><br> == フォーカスイベント == <code>QLineEdit</code>クラスには、<code>textChanged</code>シグナルや<code>textEdited</code>シグナルは存在するが、フォーカスに関係したシグナルが存在しない。<br> <br> 例えば、エディットコントロールの初期表示において、"キーワードを入力してください..."等を表示して、フォーカスインで消去する場合、<br> <code>QLineEdit</code>クラスの<code>focusInEvent</code>メソッドおよび<code>focusOutEvent</code>メソッドをオーバーライドすることで実現できる。<br> <br> 以下の例では、<code>QLineEdit</code>クラスを継承した派生クラスを作成して、フォーカスイベントを処理している。<br> Qt Designerで配置したラインエディットのコントロールは、<code>QLineEdit</code>クラスを継承した派生クラスに昇格させる。<br> <syntaxhighlight lang="c++"> // 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); } </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // 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; }; </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // 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; } </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // 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; }; </syntaxhighlight> <br> ただし、<code>focusInEvent</code>メソッドおよび<code>focusOutEvent</code>メソッドのオーバーライドでは、<br> 各ラインエディットでフォーカスインおよびフォーカスアウトの処理が異なる場合は煩雑となる。<br> <br> 各ラインエディットにて、異なるフォーカスイベントの処理を記述する場合、シグナルを作成する。<br> <br> 以下の例では、各ラインエディットの外部から、フォーカスイベントを取得している。<br> 動作結果は、上記のサンプルコードと同様である。<br> <syntaxhighlight lang="c++"> // QLineEditEx.cpp #include "QLineEditEx.h" QLineEditEx::QLineEditEx(QWigedt *parent) : QLineEdit(parent) { } void QLineEditEx::focusInEvent(QFocusEvent *e) { QLineEdit::focusInEvent(e); emit focused(true); } void QLineEditEx::focusOutEvent(QFocusEvent *e) { QLineEdit::focusOutEvent(e); emit focused(false); } </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // 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; signals: void focused(bool); }; </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // MainWindow.cpp #include "MainWindow.h" #include "ui_MainWindow.h" MainWindow::MainWindow(QMainWindow *parent) : QMainWindow(parent), ui(new Ui::Widget) { ui->setupUi(this); connect(ui->lineEdit, &QLineEditEx::focused, this, &MainWindow::focusEvent); } MainWindow::~MainWindow() { delete ui; } void MainWindow::focusEvent(bool focused) { } </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // MainWindow.h #pragma once #include <QMainWindow> #include "QLineEditEx.h" namespace Ui {class MainWindow;} class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QMainWindow *parent = nullptr); ~MainWindow(); private: Ui::MainWindow *ui; private slots: void focusEvent(bool); }; </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:Qt]]
Qtのコントロール - ラインエディット
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse