Global shortcuts
-
Ρε παιδιά υπάρχει περίπτωση να βάλουνε Global shortcuts;
https://bugreports.qt-project.org/browse/QTBUG-5183
Εσείς χρειάζεστε Global shortcuts;
-
Και βέβαια τα χρειαζόμαστε...
Αν το ψάξεις γίνεται με 3rd party Qt library, αλλά βρήκα (για linux τουλάχιστον) τρόπο να το κάνω με libkeybinder.
-
Τσέκαρε τον κώδικα του Wallch που φτιάχνω με ένα φίλο αυτή τη στιγμή
https://code.launchpad.net/~wallch/wallpaper-changer/trunk
Τον παίρνεις είτε με
@bzr branch lp:wallpaper-changer@
είτε από το tarball:
http://bazaar.launchpad.net/~wallch/wallpaper-changer/trunk/tarball/78Ψάξε για "keybinder" μέσα στον κώδικα και θα βρεις πώς χρησιμοποιείται. Κυρίως στα αρχεία mainwindow/preferences.cpp
Αλλά θα βρεις και στο web παραδείγματα, σίγουρα.
-
Anytime!
Αν δεν το βρεις πες μου να σου γράψω εδώ ολοκληρωμένο παράδειγμα χρήσης του.
-
το preferences.php κάνει include to keybinder.h στη γραμμ 29, αλλά δεν υπάρχει τέτοιο αρχείο, δεν μου το βρίσκει...
Ποια έκδοση του libkeybinder χρησιμοποιείς;
Εγκατέστησα το libkeybinder-3.0-0Αν μπορείς να γράψεις ένα απλό παράδειγμα χρήσης του, θα σου είμαι υπόχρεος...
-
Όταν χρησιμοποιείς 3rd party βιβλιοθήκες στα linux να κάνεις τα εξής:
- Κατεβάζεις και εγκαθιστάς το -dev πακέτο (εδώ libkeybinder-dev)
- Βάζεις την dependency στο .pro αρχείο σου, μέσω του PKGCONFIG (π.χ.
CONFIG += link_pkgconfig
PKGCONFIG += keybinderόπου (εγώ τουλάχιστον) για να βρω τι θέλει το pkgconfig για να κάνει το linking (εδώ θέλει τη λέξη keybinder) τρέχω σε κονσόλα
@pkgconfig --list-all | grep "something"@
Για παράδειγμα:
@alex@MaD-pc:~$ pkg-config --list-all | grep "keybinder"
keybinder keybinder - Register global keyboard shortcuts@Αυτό είναι σημαντικό βήμα γιατί θα μπορούσε να ήταν keybinder-1.0 ή libkeybinder και δεν μπορείς να ξέρεις ακριβώς από πριν.
)Τώρα, έχοντας κάνει τα 2 πάνω βήματα, στον κώδικά σου αρκεί να κάνεις τα εξής:
@#include "keybinder.h"
...
keybinder_init();
//ΓΙΑ ΝΑ ΚΑΝΕΙΣ BIND ΕΝΑ SHORTCUT
keybinder_bind(SOME_SHORTCUT.toLocal8Bit().data(), handler, NULL)
//ΓΙΑ ΝΑ ΤΟ ΒΓΑΛΕΙΣ ΜΕΤΑ
keybinder_unbind(SOME_SHORTCUT.toLocal8Bit().data(), handler);
//όπου handler μπορεί να είναι μια κενή συνάρτηση του τύπου
void handler (const char *, void *)
{
}@Το SOME_SHORTCUT είναι QString. Το θέμα που προέκυψε σε μένα ήταν το τι τιμές μπορεί να πάρει έτσι ώστε να το αναγνωρίσει o keybinder. Δηλ. αν του δώσεις σαν QString το "DEN KSERW TI MOU GINETAI" δεν νομίζω να μπορέσει να κάνει bind το shortcut, ενώ συγκεκριμένα πράγματα, όπως το "<Alt><Shift>G" δουλεύουν (άλλο παράδειγμα string που θα δούλευε εδώ: "εδώ":http://i.imgur.com/dOvWW6n.png )
Ο handler είναι η συνάρτηση που τρέχει όταν καλεστεί το αντίστοιχο shortcut. Δεν πρέπει να είναι μέλος κάποιας κλάσης. Αν χρειάζεσαι access από κει κάποια άλλη συνάρτηση κάποιας κλάσης, κάνε file-global pointer της κλάσης και κάλεσε από αυτόν τον pointer ότι χρειάζεσαι. Αυτό έχουμε κάνει στο mainwindow.cpp με τη συνάρτηση nextKeySignal.
Εδώ έχω μια λίστα με την αντιστοιχία του τρόπου που ο Qt βλέπει τα κουμπιά με τον τρόπο που ο keybinder τα βλέπει (τον κώδικα τον πήρα από το preferences.cpp):
-
Έκανα update την απάντησή μου για να εξηγήσω τον handler.