Seite 1 von 1
Hilfe mit Tastensteuerung
Verfasst: 9. Januar 2008 21:54
von Snafu
Hallo!
Ich möchte ein Steuerungsprogramm für einen Roboter (über RS232) mit C++ & Qt schreiben.
Programm wird so aussehen:
- Ein QTextEdit Element, dass Ausgaben vom Roboter und Eingaben vom Steuerungsprogramm anzeigt
Ein QLineEdit Element für die Eingabe (Befehl händisch zum Bot senden, Terminalausgabe)
Mehrere QPushButtons, die bestimmte Befehle and den Bot senden
Es sollen die Befehle aller Buttons auch mit direktem Tastendruck ausgelöst werden können.
Meine Frage ist nun, wie setze ich das am besten um?
Wenn ich etwas ins QLineEdit schreibe möchte ich z.B. nicht, dass Befehle durch Tastendruck ausgeführt werden.
Hab mir überlegt, dass ich einen extra Button mache, der die Tastensteuerung (de-)aktiviert.
Wie würdet ihr das lösen?
LG
Verfasst: 9. Januar 2008 22:09
von upsala
Entweder Control/Alt-Tastenkombinationen benutzen, oder mal testen was passiert wenn z.B. ein QShortcut("A") existiert, wie das QLineEdit darauf reagiert.
Verfasst: 9. Januar 2008 22:53
von Snafu
Danke für die Antwort!
Hab jetzt testweise ein paar Shortcuts gemacht und sobald man etwas ins QLineEdit schreibt deaktivieren sie sich von selbst.
Hab ne andere Frage: ich hab vorhin auf meinem Laptop (Debian) gearbeitet und hab jetzt den Quellcode auf meinen PC (XP x64) verschoben. Wenn ich am PC das Programm von der Kommandozeile starte, dann kommt auf der Kommandozeile gleich wieder der normale "Eingabeprompt". Wie kann ich unter Windows die qDump ausgabe sehen?
Beschäftige mich erst seit 3 Tagen mit Qt.
LG
Verfasst: 9. Januar 2008 23:50
von Snafu
O.K. das mit dem qDebug hat sich erledigt. Habe ein Programm gefunden, dass die Debugmeldungen ausgibt. Link zum Programm ist unter
http://lists.trolltech.com/qt-interest/ ... 00313.html zu finden (in einem der letzten Posts).
Andere Frage hätte ich.
Ich will beim Drücken und beim Loslassen von bestimmten Tasten die Befehle an den Bot senden. Mit QShortcut hat ja alles ganz gut funktionniert, aber das löst nur beim Drücken aus und bei langem Drücken wiederholt. Ich will einmal beim Drücken und einmal beim Loslassen eine Methode / Slot / was auch immer ausführen.
Mit keyPressEvent und keyReleaseEvent hats nicht so gut funktionniert wie mit den QShortcuts.
Irgendwelche Tipps?
LG
Verfasst: 10. Januar 2008 09:11
von upsala
Das ist auf jeden Fall keine Fehlerbeschreibung:
Mit keyPressEvent und keyReleaseEvent hats nicht so gut funktionniert wie mit den QShortcuts.
Bitte etwas konkreter.
Verfasst: 10. Januar 2008 10:40
von Snafu
O.K.
Mit keyPressEvent und keyReleaseEvent hats irgendwie nur hingehaut wenn ich im LineEdit drinnen war (da sollts aber eigtl deaktiviert sein) allerdings ging da auch nicht alles. Erst mit grabKeyboard wurden alle Tasten "erkannt" allerdings wieder nur wenn ich im LineEdit drin war.
Die Shortcuts sind schon angenehmer (auch wenn ich pro Shortcut einen eigenen Slot brauche). Mit setAutorepeat (oder so) hab ich auch das andauernde Wiederholen deaktivieren können. Problem ist nur, dass nur das Drücken erkannt wird, nicht aber das Loslassen.
Soll ich mein derzeitiges Programm (nur ganz klein) hochladen?
Verfasst: 10. Januar 2008 12:17
von upsala
Das keyPressEvent und keyReleaseEvent ist auf ein einzelnes Widget begrenzt, QShortcut wirkt auf die gesamte Anwendung. Es müßte aber möglich sein, mittels eventFilter die Press/Release-Events der gesamten Anwendung abzufangen.
Status quo
Verfasst: 11. Januar 2008 15:25
von Snafu
Hab nun halbwegs hinbekommen was ich haben möchte.
Die Tastensteuerung wird mittels Button de-/aktiviert indem dem Basewidget der Focus gegeben wird. Im Eventfilter wird dann auf die entsprechenden Events vom Basewidget reagiert.
Sobald das Basewidget den Focus verliert, bricht die Tastensteuerung ab.
Edit: bin gerade draufgekommen, dass genau das meinen "Buttontoggle" ruiniert. Wenn der Button den Focus bekommt dann bricht automatisch die Tastensteuerung ab. Jetzt wird der Button gedrückt und anstatt die Steuerung dann abzubrechen wird sie wieder aktiviert. Lösungsvorschläge?!
Hab mal meinen bisherigen Code dazugepackt falls ihn wer sehen will und ein paar Verbesserungsvorschläge hat.
Jetzt hab ich nur noch das "Problem" mit den Buttons. Kann man irgendwie erreichen, dass beim Button etwas beim Drücken und Auslassen geschieht? Das Signal toggled() geht irgendwie nicht. Hab daweil clicked() aber da müsste ich dann "manuell" togglen (wie beim Steuerungsbutton, da aber gewünscht) mit 2 mal klicken.
LG
Verfasst: 11. Januar 2008 19:52
von upsala
Dafür gibt es die Signale pressed() und released(). toggled() würde ich nur für Radio und Check-Boxen verwenden.
Den Steuerungs-Button würde ich wenn er gedrückt wurde, auch ein 'gedrückt'-Design verpassen und nicht 'flat'.
Und in deiner Event-Routine ist ein Teil des Codes doppelt vorhanden.
Verfasst: 12. Januar 2008 03:17
von Snafu
upsala hat geschrieben:Den Steuerungs-Button würde ich wenn er gedrückt wurde, auch ein 'gedrückt'-Design verpassen und nicht 'flat'.
Danke, hab das mit setFlat() jetzt geändert.
upsala hat geschrieben:Und in deiner Event-Routine ist ein Teil des Codes doppelt vorhanden.
Hab ich auch bemerkt, hab das auch geändert.
Bin jetzt schon recht zufrieden wies im Moment ist.
Hab zwei Änderungen vorgenommen.
- Steuerung verwendet nun auch grabKeyboard(). Erklärung warum dauert zu lang

Hab die zweite Steuerungsabbruchbedingung (erste = Button) jetzt nicht beim Hauptwidget auf FocusOut sondern nur bei der Terminalleiste auf FocusIn. So muss ich halt jedem weiteren Element das Tastatureingaben benötigt das Hauptwidget als EventFilter übergeben und bei diesem auch beim FocusIn die Steuerung abbrechen. Was anderes fällt mir nicht ein.
Habt ihr vl eine Idee, wie man den Tastensteuerungs(abbruch) eleganter machen könnte? Hab mir erst vor 3 Tagen Qt angeschaut und das wird mein erstes Qt Programm (und C++ eigtl auch).
LG
PS: Neuer Source code is angefügt falls es wen interessiert.