2013-10-10 12 views
6

Ich habe eine einfache Anwendung mit nur einem QPlainTextEdit, im Grunde das gleiche wie Qt Beispiel hier:Verhindern Schlüsselereignisse

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

Wenn ich Strg + Z drücken, ruft sie rückgängig zu machen. Wenn ich Strg + A drücke, wird der gesamte Text ausgewählt. Das ist in Ordnung.

Wenn ich jedoch Strg + E oder Strg + R drücke, die nicht im Menü definiert sind, erscheinen die Zeichen "e" und "r" in QSimpleTextEdit.

Wie verhindere ich das? Wie man Tastendrucke, die als Menüverknüpfungen definiert wurden, "filtert", damit sie funktionieren, und "verhindern", dass Tastendrucke, die nicht als Menüverknüpfungen definiert sind, in der Bearbeitung erscheinen?

Antwort

1

Es gibt 2 Möglichkeiten:

1) eine Unterklasse erstellen und keyPressEvent()

2) Erstellen Sie eine event reimplementieren und verwenden installEventFilter() (siehe http://qt-project.org/doc/qt-5.0/qtcore/qobject.html#installEventFilter)

+0

Können Sie spezifischer bitte sein? Insbesondere muss ich, wenn ich mit der ersten Option gehe, alle im Menü definierten Schlüssel überprüfen, sie loslassen und alles andere ignorieren? Mit anderen Worten: Muss ich manuell alle Menüverknüpfungen entweder in der Unterklasse oder in eventFilter auflisten, oder gibt es eine Möglichkeit, die Menüdefinition automatisch aus dem Menü zu ziehen? –

+0

Ich glaube nicht, dass Sie die definierten Kombinationen leicht auslesen könnten, aber schließlich könnten Sie '' QKeyEvent :: text(). Size()> 0 && QKeyEvent :: Modifikatoren! = Qt :: NoModifier'' benutzen. Ich denke '' text() '' zeigt nur den resultierenden Text, aber ich muss das testen. Aber im Allgemeinen reimplementiert das Ereignis wird größer als ursprünglich geplant, zumindest geschah dies immer uns –

+0

Also nur um zu überprüfen, ob ich verstanden habe: Wenn das oben Trick nicht funktionieren würde (ich werde es versuchen, obwohl!), Muss man sich erinnern Verknüpfungen, die die Anwendung verwendet (A = Alles auswählen, X = Ausschneiden, Z = Rückgängig, ...) und dann in der Unterklasse oder EvenFilter manuell überprüfen, ob der Ereignisschlüssel zu A, X, Z, ... gehört und alles ablehnt sonst. Ist das richtig? Weil, weißt du, dann muss ich es zweimal eingeben und wenn ich der Anwendung eine Abkürzung hinzufüge und vergess, die Unterklasse zu ändern, dann wird es brechen ... –

1

Sie den folgenden Code verwenden:

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

Ich benutze auch 5.1. Nur um zu überprüfen - in dem obigen Code hast du QPlainTextEdit in keiner Weise verändert, oder? Weil es nicht funktioniert, d.h. die Strg + j ** zeigt **. –

+0

Nun, ich benutze es in Ubunt 13.04, Windows 8 (vc2012) und Mac OS X Snow Leopard, aber sie verhalten sich genauso. Ich habe es überprüft und ALT + erscheint, aber STRG + nicht; ALT + zeigt an, ob die Tastenkombination nicht als Aktionsverknüpfung oder Menü-/Buddy-Zugriff festgelegt wurde. Aber ich werde versuchen, eine Lösung für Sie zu erstellen, solange Sie nur Tastendrucke, aber keine Tastaturmodifizierer verarbeiten können. – delverdl

Verwandte Themen