「Qtのコントロール - ラインエディット」の版間の差分
(ページの作成:「== 概要 == Qtのコントロールであるラインエディットについて記載する。<br> <br><br> == 入力文字の確認 == ==== QValidatorクラスを使…」) |
|||
(同じ利用者による、間の11版が非表示) | |||
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> | ||
111行目: | 138行目: | ||
* <code>QValidator</code>クラスを継承した派生クラスにて、以前の文字数を保存しておき、増加した文字数分の内容を全てを確認する。 | * <code>QValidator</code>クラスを継承した派生クラスにて、以前の文字数を保存しておき、増加した文字数分の内容を全てを確認する。 | ||
<br><br> | <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> | |||
{{#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
クラスを継承した派生クラスを作成して、以下の処理を記述する。
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
クラスを継承した派生クラスにて、以前の文字数を保存しておき、増加した文字数分の内容を全てを確認する。
貼り付けを無効にする
キーボード入力以外の入力方法として、ラインエディットに文字列を入力するには、以下の方法がある。
- コンテキストメニュー(右クリックメニュー)から貼り付ける。
- 文字列を選択してドラッグ&ドロップする。
- [Ctrl] + [V]キーで貼り付ける。
上記の方法を無効化する方法を以下に示す。
- コンテキストメニューの無効化
- Qt Designerにて、
contextMenuPolicy
プロパティの値ををNoContextMenu
にする。 - また、ソースコードにて以下を記述する。
setContextMenuPolicy(Qt::NoContextMenu);
- 無効にしない場合、値を
NoContextMenu
ではなくCustomContextMenu
にして、独自のコンテキストメニューを作成してもよい。
- Qt Designerにて、
- ドラッグ&ドロップの無効化
- Qt Designerにて、
acceptDrops
プロパティのチェックボックスからチェックを外す。 - また、ソースコードにて以下を記述する。
setAcceptDrops(false);
- Qt Designerにて、
- [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);
};