そもそもキーボード直接入力以外の入力方法について
キーボード直接入力以外でQLineEditに文字列を入力するには、以下の方法があります。
- コンテキストメニュー(右クリックメニュー)から貼り付け
- 文字列を選択してドラッグ&ドロップ
- Ctrl + Vで貼り付け
1. コンテキストメニューの無効化
デザイン画面にて、「contextMenuPolicy」を「NoContextMenu」にするか、以下コードにて可能です。
無効にしたくない場合、「NoContextMenu」ではなく「CustomContextMenu」にし、独自のコンテキストメニューを作成しても構いません。
setContextMenuPolicy(Qt::NoContextMenu);
2. ドラッグ&ドロップの無効化
デザイン画面にて、「acceptDrops」のチェックを外すか、以下コードにて設定可能です。
無効にしていない場合、テキストエディタなどで入力した文字列を選択し、選択した文字列をQLineEdit上にマウスでドラッグ&ドロップすると、QLineEditに入力出来てしまいます。
setAcceptDrops(false);
3. Ctrl + Vの無効化
QLineEdit::keyPressEvent()をオーバーライドすることで可能です。
以下サンプルにて説明します。
サンプル
デザイン。
QLineEditが1つあるだけです。
QLineEditを継承したLineEditクラスに昇格させています。
また、「contextMenuPolicy」「acceptDrops」の設定も、ここでしています。
コード。
簡略化のためwidget.cpp/widget.hにLineEditクラスを実装していますが、別ファイル化することをお勧めします。
11行目にて、押下されたキーの組み合わせが貼り付けに該当する場合、イベントを無視するようにしています。
#include "widget.h" #include "ui_widget.h" LineEdit::LineEdit(QWidget *parent) : QLineEdit(parent) { } void LineEdit::keyPressEvent(QKeyEvent *event) { if (event->matches(QKeySequence::Paste)) { event->ignore(); } else { return QLineEdit::keyPressEvent(event); } } Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); } Widget::~Widget() { delete ui; }
#ifndef WIDGET_H #define WIDGET_H #include <QKeyEvent> #include <QLineEdit> #include <QWidget> namespace Ui { class Widget; } class LineEdit : public QLineEdit { Q_OBJECT public: LineEdit(QWidget *parent = nullptr); protected: void keyPressEvent(QKeyEvent *) override; }; class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = nullptr); ~Widget(); private: Ui::Widget *ui; }; #endif // WIDGET_H