C++ [Qt] Tastaturevents abfangen / abfragen

MeandXP

Ensign
Registriert
Juli 2009
Beiträge
171
Moinsen,

Für die einfachere Bedienbarkeit eines Programms würde ich gerne manche funktionen per Tastendruck ausführen lassen, z.B. öffnen eines zweiten Fensters oder eines Abschnittes der Menüleiste. Für QMenuBar habe ich in der Dokumentation die keyPressEvent() Funktion gefunden, frage mich jedoch nun wie diese zu benutzen ist um beispielsweise die Funktionstasten oder Tastenkombinationen abzufragen.

mfg, MeandXP.
 
Du kannst beim designen der Menüleiste bereits Tastenkürzel angeben, sofern du den Qt Designer benutzt.
Ansonsten kann ich dir morgen (Montag) mehr dazu sagen.

Prinzipiell solltest du dir aber die Klassen QAction und QShortcut anschauen.
Ersteres ist für Aktionen die du z.B. über Buttens in einer Toolbar oder auch bei Menüeinträgen auslösen willst.
Zweiteres ist für Tastaturkürzel.
 
QShortcut sieht gut aus, habe aber noch Probleme bei der Anwendung.
Zum Beispiel funktioniert das:
Code:
new QShortcut (Qt::Key_8, this, SLOT(about()));
Das aber nicht:
Code:
new QShortcut (Qt::Key_Alt + Qt::Key_I, this, SLOT(about())); //ohne Klammern, oder:
new QShortcut ((Qt::Key_Alt + Qt::Key_I), this, SLOT(about())); //mit Klammern
Was ja für TastenKOMBINATIONEN ganz nützlich wäre ^^
Was mache ich falsch? Ist das überhaupt die feine Art es so zu schreiben, oder kann man das Tastenkürzel auch "wie eine Variable" deklarieren, und dann das activated Signal per connect mit dem Slot verknüpfen?

mfg, MeandXP.
 
Hallo MeandXP,

jetzt kann ich dir was zum Thema schreiben.
Im Normalfall erstellt man keine "unsichtbaren" Tastaturkürzel (Shortcuts). Es ist benutzerfreundlicher, wenn der Benutzer Funktionen, die per Shortcut aufgerufen werden können auch als Menüeintrag findet. Beispiel: Menü Datei -> Neu (Strg+N). Kann per Maus in Menü oder per Kürzel aufgerufen werden.

Solche Kürzel beginnen für gewöhnlich mit Strg (das ist halt einfach guter Stil).
Diese Alt + x Kombinationen sind sogenannte "Accelerators". Sie beschleunigen den Zugriff auf Menüeinträge durch die Kombination der Alt-Taste und des im Menüeintrag unterstrichenen Buchstabens. Sicher schon mal gesehen :).

So viel dazu.
Menüeinträge werden in Qt als QAction implementiert. Dann hat man was Anklickbares. Wenn ein Menüeintrag per Shortcut aktivierbar sein soll wird der Action ein Shortcut zugewiesen.

Beispiel:
PHP:
QMenu* menu_File = new QMenu(menuBar);
QAction* action_New = new QAction(yourQMainWindowInstance);
QAction* action_Insert = new QAction(yourQMainWindowInstance);

menu_File->setTitle( "&File" ); // hier der Accelerator, dass das Menü per F aufrufbar ist
action_New->setText( "&New" ); // hier der Accelerator, dass der Eintrag per N aufrufbar ist
action_Insert->setText( "&Insert" ); // hier der Accelerator, dass der Eintrag per I aufrufbar ist

// jetzt setzen wir Shortcuts für die Menüeinträge
action_New->setShortcut( "Ctrl+N" );
action_Insert->setShortcut( "Ctrl+Alt+N" );

// nur noch kurz das Menü aufbauen
menuBar->addAction(menu_File->menuAction());
menu_File->addAction(action_New);
menu_File->addAction(action_Insert);
Was jetzt noch fehlt ist das was ausgeführt werden soll, wenn jemand einen Menüeintrag aufruft (per Maus oder Tastatur).
Du kannst einfach das Signal action_New->triggred() mit einem Slot deiner Wahl verbinden.
PHP:
connect(action_New, SIGNAL(triggered()), this, SLOT(createNewFile()));

Habe ich was vergessen?
Schau dir zusätzlich in der Doku das "Menus Example" an.
Viel Spaß. Wenn noch Fragen sind...
 
Vielen Dank erstmal für die ausführliche Antwort!
Habe jetzt für Pushbuttons auch die Funktion "setShortcut" gefunden und ausprobiert:
Code:
ui->pb_calc->setShortcut(QKeySequence(Qt::Key_Alt + Qt::Key_I));
Es kompiliert ohne Fehler oder Warnungen, allerdings ist dieser Shortcut wieder "wirkungslos", es passiert einfach nichts.
Was ist jetzt wieder falsch? :D

mfg, MeandXP.

Edit: Key_Ctrl ist angeblich kein member von Qt. Benutze die aktuelle Version, heisst die da anders?
Edit2: Heisst anscheinend Key_Control, funktioniert leider trotzdem nicht
 
Zuletzt bearbeitet:
Die Shortcuts bei Buttons beziehen sich immer auf den unterstrichenen Buchstaben.
Wenn du einem Button den Text "&Calculate" gibst, dann ist der Shortcut automatisch Alt+C.
Dort wo das & davorsteht wird der Buchstabe unterstrichen und ist somit der Shortcut.

Du kannst aber auch den Text "Calculate" geben und mit setShortcut(QKeySequence("Alt+C")) den selben Effekt erzielen. Ist halt aufwändiger.
Tipp: Schreibe die Shortcuts ruhig in der Stringschreibweise "Alt+C". Ist leichter als Qt::Key_Alt + Qt::Key_C ;).

Keine Ahnung ob Shortcuts, die mit Ctrl beginnen auf Buttons gelegt werden können. Ist halt sehr, sehr unüblich. Ich würde das Programm dafür hassen. Buttons werden entweder über Maus aktiviert oder schneller über den Shortcut Alt+UnterstrichenerBuchstabe.

Tastenkürzel mit Ctrl beziehen sich halt irgendwie immer auf Funktionen, die über das Menü aktivierbar sind. So isses halt :).
 
Vielen Dank, mit der Alt Taste klappts besser!
Hatte Qt::Key_ benutzt, da man dann alle möglichen Vorschläge angezeigt bekommt, so hab ich auch rausgefunden dass es bei mir key_ctrl nicht gibt (heisst wohl key_control).
Werd das jetzt erstmal ne Weile in meine Programme einbauen, bin mal gespannt aus welchem Grund ich hier das nächste mal posten muss :D

mfg, MeandXP.
 
Zurück
Oben