6

QPlainTextEdit が 1 つだけの単純なアプリケーションがあります。基本的には、ここの Qt の例と同じです。

http://qt-project.org/doc/qt-5.1/qtwidgets/mainwindows-application.html

Ctrl+Z を押すと、取り消しが呼び出されます。Ctrl+A を押すと、すべてのテキストが選択されます。これで結構です。

しかし、メニューで定義されていない Ctrl+E または Ctrl+R を押すと、文字 "e" と "r" が QSimpleTextEdit に表示されます。

これを防ぐにはどうすればよいですか?メニューショートカットとして定義されたキープレスを「フィルタリング」して機能させ、メニューショートカットとして定義されていないキープレスが編集に表示されないようにする方法は?

4

2 に答える 2

1

次のコードを使用できます。

CSimpleEdit.h

#include <QPlainTextEdit>
class CSimpleEdit: public QPlainTextEdit
{ Q_OBJECT
  public:
    explicit      CSimpleEdit(QWidget* parent = 0);
    ~             CSimpleEdit();
  protected:
    bool          eventFilter(QObject* obj, QEvent* event);
};

CSimpleEdit.cpp

CSimpleEdit::CSimpleEdit(QWidget* parent)
  : QPlainTextEdit(parent)
{ installEventFilter(this); }

CSimpleEdit::~CSimpleEdit()
{ removeEventFilter(this); }

bool CSimpleEdit::eventFilter(QObject *obj, QEvent *event)
{
  if (event->type() == QEvent::KeyPress)
  { QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
    if (keyEvent->modifiers() != Qt::NoModifier &&
        !keyEvent->modifiers().testFlag(Qt::ShiftModifier))
    { bool bMatch = false;
      for (int i = QKeySequence::HelpContents; i < QKeySequence::Deselect; i++)
      { bMatch = keyEvent->matches((QKeySequence::StandardKey) i);
        if (bMatch) break;
      }
      /*You can also set bMatch to true by checking you application
       *actions list -> QWidget::actions(). */
      if (!bMatch) return true;
    }
  }
  else if (event->type() == QEvent::KeyRelease)
  { QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
    if (keyEvent->modifiers() != Qt::NoModifier &&
        !keyEvent->modifiers().testFlag(Qt::ShiftModifier))
    { bool bMatch = false;
      for (int i = QKeySequence::HelpContents; i < QKeySequence::Deselect; i++)
      { bMatch = keyEvent->matches((QKeySequence::StandardKey) i);
        if (bMatch) break;
      }
      if (!bMatch) return true;
    }
  }
  return QObject::eventFilter(obj, event);
}
于 2013-10-21T18:31:33.790 に答える