2013-10-10 3 views
6

У меня есть простое приложение, с помощью только одного QPlainTextEdit, в основном так же, как, например в Qt здесь:Предотвращение ключевых событий

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

При нажатии Ctrl + Z, он вызывает откат. Когда я нажимаю Ctrl + A, он выбирает весь текст. Хорошо.

Но когда я нажимаю Ctrl + E или Ctrl + R, которые не определены в меню, символы «e» и «r» появятся в QSimpleTextEdit.

Как предотвратить это? Как «фильтровать» нажатия клавиш, которые были определены как ярлыки меню и поддерживать их работоспособность, и «предотвращать» те нажатия клавиш, которые не определены, как ярлыки меню, появляющиеся в редакторе?

ответ

1

Есть 2 варианта:

1) Создание подкласса и переопределение keyPressEvent()

2) Создание eventFilter и использовать installEventFilter() (см http://qt-project.org/doc/qt-5.0/qtcore/qobject.html#installEventFilter)

+0

Не могли бы вы быть более конкретным, пожалуйста? В частности, перейдя к первому варианту, нужно ли проверять каждый из всех ключей, определенных в меню, отпускать их и игнорировать все остальное? Другими словами: мне нужно вручную перечислять все ярлыки меню либо в подклассе, либо в eventFilter, или есть способ автоматически вывести из определения меню? –

+0

Я не думаю, что вы могли бы легко прочитать определенные комбинации, но в конце концов вы могли бы использовать '' QKeyEvent :: text(). Size()> 0 && QKeyEvent :: modifiers! = Qt :: NoModifier''. Я думаю, что '' text() '' показывает только полученный текст, но мне нужно будет это проверить. Но, как правило, повторное выполнение события становится больше, чем первоначально запланировано, по крайней мере, это всегда происходило с нами –

+0

Итак, просто чтобы проверить, понял ли я: если этот трюк не будет работать (я попробую, хотя!), Нужно помнить, какие ярлыки, используемые приложением (A = Выбрать все, X = Вырезать, Z = Отменить, ...), а затем в подклассе или evenFilter вручную проверить, был ли ключ события одним из A, X, Z, ... и отклонить все остальное. Это верно? Потому что, знаете ли, мне нужно ввести его дважды, и если я добавлю ярлык к приложению и забуду изменить подкласс, тогда он сломается ... –

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); 
} 
+0

Я тоже использую 5.1. Чтобы проверить код выше, вы не изменили QPlainTextEdit каким-либо образом, не так ли? Потому что он не работает, т. Е. Отображается ctrl + j ** **. –

+0

Ну, я использую его в Ubunt 13.04, Windows 8 (vc2012) и Mac OS X Snow Leopard, но они ведут себя одинаково. Я проверил его и появился ALT + , но CTRL + не делает; ALT + показывает, если комбинация клавиш не установлена ​​в качестве ярлыка действий или доступа к меню/приятелю. Но я постараюсь создать для вас решение, пока вы можете обрабатывать только нажатия клавиш, но не модификаторы клавиатуры. – delverdl

Смежные вопросы