QShortcutEvent funktioniert nicht



  • Hi,
    ich bin dabei einen kleinen Texteditor zu proggen. Um die autmatische Einrückung zu machen musste ich, per QkeyEvent auf die Enter-Taste reagieren. Das event fängt also jeden Tastendruck ab. Hie bekomme ich dann das problem mit den Shortcuts. Ich richte ein Menü ein, welches bis auf die Tastenkürzel funktioniert.
    Drückt man bspw. "Strg+Z" so erscheint ein komisches zeichen im textfeld, anstatt dass die undo()-Funktion aufgerufen wird. Jetzt hab ich folgendermaßen versucht auch noch ein QShortcutEvent einzurichten, um auf die Tastenkürzel zu reagiern:

    //Funktion "void shortcutEvent(QShortcutEvent* event)" in der Klasse Textedit (abgeleitet von QPlainTextEdit) als public angelegt
    void Textedit::shortcutEvent(QShortcutEvent* event)
    {
        if(event->key() == QKeySequence("Ctrl+Z"))
        {
            QPlainTextEdit::undo();
        }
        else if(event->key() == QKeySequence("Ctrl+Y"))
        {
            QPlainTextEdit::redo();
        }
    }
    

    Allerdings funktioniert auch das nicht. Es erscheint immer noch das komische 4-Eck im Textfeld, wenn ich "Strg+Z" drücke. Was mache ich falsch? Oder kennt ihr eine andere Lösung?

    mfg energetic

    -----------Edit------------
    Wenn jmd. wüsste wie man die automatische Einrückung hinbekommt, ohne QEvent zu verwenden, dann wären alle Probleme gelöst.
    Weiß denn wirklich niemand Rat?
    ---------Edit Ende----------



  • energetic schrieb:

    Einrückung zu machen musste ich, per QkeyEvent auf die Enter-Taste reagieren.

    Meinst du damit, dass du die virtuelle Funktion keyPressEvent überschrieben hast?

    energetic schrieb:

    Ich richte ein Menü ein, welches bis auf die Tastenkürzel funktioniert.
    Drückt man bspw. "Strg+Z" so erscheint ein komisches zeichen im textfeld, anstatt dass die undo()-Funktion aufgerufen wird.

    Ctrl+Z sollte doch eigentlich standardmäßig schon funktionieren, ohne dass du da selber noch irgendwie ein Menü mit Shortcut dazu basteln musst.

    energetic schrieb:

    Jetzt hab ich folgendermaßen versucht auch noch ein QShortcutEvent einzurichten, um auf die Tastenkürzel zu reagiern

    Soweit ich weiß kannst du mit QShortcutEvent nur Shortcuts abfangen, wenn der Keyboardfocus nicht gerade im Textedit liegt.



  • JustSomeCoder schrieb:

    Meinst du damit, dass du die virtuelle Funktion keyPressEvent überschrieben hast?

    Ob er sie überschrieben hat, weiß ich nicht. Jedenfalls hab ich folgendemaßen auf die Enter-Taste reagiert:

    //Funktion "void keyPressEvent(QKeytEvent* event)" in der Klasse Textedit (abgeleitet von QPlainTextEdit) als public angelegt
    void Textedit::keyPressEvent(QKeyEvent* event)
    {
        if(event->key() == Qt::Key_Enter)
        {
            //lese vorherige Zeile aus und mache entsprechende Einrückung
        }
        else if(event->key() == /*regiere auf weitere Tasten*/)
        {
            //anweisungen
        }
        else if //usw. 
    }
    

    Dise Event-Funktion fängt jeden Tastendruck ab. Somit auch die Tastenkürzel. Deshalb habe ich ja auch versucht sie mit QShortcutEvent wieder funktionsfähig zu machen(was wie gesagt aber nicht funktoiniert hat). Die Kürzel, die noch nicht vorgegeben sind, bspw. "Ctrl+S", funktionieren, nachdem ich sie im Menü eingerichtet habe.



  • Normalerweise wäre es schon sinnvoll wenn du auch die standardmäßige Implementierung der keyPressEvent() Funktion in deiner überschriebenen Variante aufrufst.
    Dann sollten eigentlich die ganzen Standardsachen wieder gehen, wie zum Beispiel normalen Text schreiben, aber auch die vordefinierten Shortcuts wie CTRL+Z um etwas rückgängig zu machen.

    void Textedit::keyPressEvent(QKeyEvent* event)
    {
        if(event->key() == Qt::Key_Enter)
        {
            //lese vorherige Zeile aus und mache entsprechende Einrückung
        }
        else if(event->key() == /*regiere auf weitere Tasten*/)
        {
            //anweisungen
        }
    
        // ...
    
        QTextEdit::keyPressEvent(event); // Das event noch weiterreichen an die originale Implementierung dieser Funktion
    }
    


  • Vielen Dank, JustSomeCode, mit dem Aufruf der Methode aus der anderen Klasse funktioniert es einwandfrei. Schon komisch, wenn man vor lauter Bäumen den Wald nicht sieht 😃

    MfG energetic


Anmelden zum Antworten