Qtをメインに、プログラムやITに関する情報を発信

Qtの戯言

QLineEdit

QLineEditでコピペ(貼り付け)を無効にする方法

投稿日:

そもそもキーボード直接入力以外の入力方法について

キーボード直接入力以外でQLineEditに文字列を入力するには、以下の方法があります。

  1. コンテキストメニュー(右クリックメニュー)から貼り付け
  2. 文字列を選択してドラッグ&ドロップ
  3. 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

 

-QLineEdit
-, ,

Copyright© Qtの戯言 , 2020 All Rights Reserved Powered by STINGER.