「Qtのコントロール - ラインエディット」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
 
(同じ利用者による、間の5版が非表示)
1行目: 1行目:
== 概要 ==
== 概要 ==
Qtのコントロールであるラインエディットについて記載する。<br>
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>
<br><br>


118行目: 145行目:
* [Ctrl] + [V]キーで貼り付ける。
* [Ctrl] + [V]キーで貼り付ける。
<br>
<br>
# コンテキストメニューの無効化
上記の方法を無効化する方法を以下に示す。<br>
#: Qt Designerにて、<code>contextMenuPolicy</code>プロパティを<code>NoContextMenu</code>にする。
* コンテキストメニューの無効化
#: また、ソースコードにて以下を記述する。
*: Qt Designerにて、<code>contextMenuPolicy</code>プロパティの値をを<code>NoContextMenu</code>にする。
#: <code>setContextMenuPolicy(Qt::NoContextMenu);</code>
*: また、ソースコードにて以下を記述する。
#: 無効にしない場合、<code>NoContextMenu</code>ではなく<code>CustomContextMenu</code>にして、独自のコンテキストメニューを作成してもよい。
*: <code>setContextMenuPolicy(Qt::NoContextMenu);</code>
#: <br>
*: 無効にしない場合、値を<code>NoContextMenu</code>ではなく<code>CustomContextMenu</code>にして、独自のコンテキストメニューを作成してもよい。
# ドラッグ&ドロップの無効化
*: <br>
#: Qt Designerにて、<code>acceptDrops</code>プロパティのチェックを外す。
* ドラッグ&ドロップの無効化
#: また、ソースコードにて以下を記述する。
*: Qt Designerにて、<code>acceptDrops</code>プロパティのチェックボックスからチェックを外す。
#: <code>setAcceptDrops(false);</code>
*: また、ソースコードにて以下を記述する。
#: <br>
*: <code>setAcceptDrops(false);</code>
# [Ctrl] + [V]キーの無効化
*: <br>
#: <code>QLineEdit::keyPressEvent</code>メソッドをオーバーライドする。
* [Ctrl] + [V]キーの無効化
*: <code>QLineEdit::keyPressEvent</code>メソッドをオーバーライドする。
<br>
<br>
以下の例では、ラインエディットをQLineEditクラスを継承した派生クラスQLineEditExクラスに昇格している。
以下の例では、ラインエディットを<code>QLineEdit</code>クラスを継承した派生クラス<code>QLineEditEx</code>クラスに昇格している。<br>
また、ラインエディットのcontextMenuPolicyプロパティをacceptDropsに設定している。
また、ラインエディットの<code>contextMenuPolicy</code>プロパティの値を<code>acceptDrops</code>に設定している。<br>
 
<br>
押下されたキーの組み合わせが貼り付けに該当する場合、該当イベントを無視するようにしている。
押下されたキーの組み合わせが貼り付けに該当する場合、該当イベントを無視するようにしている。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  // QLineEditEx.cpp
  // QLineEditEx.cpp
408行目: 436行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>
{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:Qt]]
[[カテゴリ:Qt]]

2024年10月14日 (月) 11:13時点における最新版

概要

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


テキストの入力

 QString str = "";
 
 // ...略
 
 if(!str.isEmpty())
 {
    lineEdit->setText(str);
 }



テキストの取得

 QString str = lineEdit->text();



パスワード入力モードにする

Qt Designerのプロパティ[echoMode]を[Password]に設定する。
または、ソースコードで以下を記述する。

 lineEdit->setEchoMode(QLineEdit::Password)



入力文字の確認

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クラスを継承した派生クラスにて、以前の文字数を保存しておき、増加した文字数分の内容を全てを確認する。



貼り付けを無効にする

キーボード入力以外の入力方法として、ラインエディットに文字列を入力するには、以下の方法がある。

  • コンテキストメニュー(右クリックメニュー)から貼り付ける。
  • 文字列を選択してドラッグ&ドロップする。
  • [Ctrl] + [V]キーで貼り付ける。


上記の方法を無効化する方法を以下に示す。

  • コンテキストメニューの無効化
    Qt Designerにて、contextMenuPolicyプロパティの値ををNoContextMenuにする。
    また、ソースコードにて以下を記述する。
    setContextMenuPolicy(Qt::NoContextMenu);
    無効にしない場合、値をNoContextMenuではなくCustomContextMenuにして、独自のコンテキストメニューを作成してもよい。

  • ドラッグ&ドロップの無効化
    Qt Designerにて、acceptDropsプロパティのチェックボックスからチェックを外す。
    また、ソースコードにて以下を記述する。
    setAcceptDrops(false);

  • [Ctrl] + [V]キーの無効化
    QLineEdit::keyPressEventメソッドをオーバーライドする。


以下の例では、ラインエディットをQLineEditクラスを継承した派生クラスQLineEditExクラスに昇格している。
また、ラインエディットのcontextMenuPolicyプロパティの値をacceptDropsに設定している。

押下されたキーの組み合わせが貼り付けに該当する場合、該当イベントを無視するようにしている。

 // 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);
    }
 }


 // 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;
 };


 // 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;
 };



フォーカスイベント

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;
 };


ただし、focusInEventメソッドおよびfocusOutEventメソッドのオーバーライドでは、
各ラインエディットでフォーカスインおよびフォーカスアウトの処理が異なる場合は煩雑となる。

各ラインエディットにて、異なるフォーカスイベントの処理を記述する場合、シグナルを作成する。

以下の例では、各ラインエディットの外部から、フォーカスイベントを取得している。
動作結果は、上記のサンプルコードと同様である。

 // 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);
 }


 // 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);
 };


 // 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)
 {
 }


 // 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);
 };