Actionlist für IR Remote

Alles rund um die Programmierung mit Qt
Antworten
sigvdr
Beiträge: 100
Registriert: 1. Juli 2008 19:29

Actionlist für IR Remote

Beitrag von sigvdr »

In einer Liste QList <KeyAction> speichere ich verschiedene SLOTS die mit definierten Tasten der Tastatur verbunden sind.
struct KeyAction {
QString displayText;
QString irRemoteKey;
QShortcut *actionKey;
const QObject *receiver;
const char *method;
};
[/code]
Aufruf durch:

Code: Alles auswählen

addShortCut("ENTER",this,SLOT(selectStream()),tr("Play"));

Code: Alles auswählen

void addShortCut(QString key, const QObject * receiver, const char * method, QString text){
// fülle die Liste
....
// erstelle ein
QShortcut action = new QShortcut(QKeySequence(key]), (QWidget *)receiver);
connect ( action ........);
}
Das mit der Tastatur funktioniert so richtig und über QShortcut wird der richtige SLOT ausgeführt.

Wie verbinde ich jetzt idealerweise meine IR Remote Tasten mit dem entsprechenden "const QObject * receiver, const char * method" .
Kann ich einen SLOT auch "manuell" ausführen ( so eine Art receiver->method() )
Irgendwie fehlt mir jetzt das richtige Stichwort für die Suche in der Doku oder in der Suchmaschine

Gruß Sig
sigvdr
Beiträge: 100
Registriert: 1. Juli 2008 19:29

Re: Actionlist für IR Remote

Beitrag von sigvdr »

Hallo,

hier habe ich eine Möglichkeit gefunden wie ich sowas realisieren kann.

Ausgehend von einer Beispielklasse

Code: Alles auswählen

class MyClass :public QWidget{ // mind. abgeleitet von QObject
Q_OBJECT
private slots:
	void methodeOfMyClass(void);
};
speichere ich die Klasse als QObject *
und den Namen des Slots als const char *
in einer entsprechenden Liste.

Code: Alles auswählen

saveToList(myClass,"methodeOfMyClass()");
saveToList(otherClass,"methodeOfOtherClass()");
So kann ich dann mit den Daten aus der Liste einen Slot (oder Methode) einer bestimmten Klasse ausführen.

Code: Alles auswählen

void execSlot( QObject * receiver, const char * methodName) {
//    int methodIndex = receiver->metaObject()->indexOfMethod(methodName); // für allgemeine Methoden
    int methodIndex = receiver->metaObject()->indexOfSlot(methodName); // nur für Slots
    QMetaMethod method = receiver->metaObject()->method(methodIndex);
    method.invoke(receiver, Qt::AutoConnection);
}
Und kann dann dem IR Tastendruck eine entsprechende Aktion zuordnen.

Code: Alles auswählen

int n = nummerDerIR_Taste(); // wie auch immer ermittelt
execSlot(liste[n]->Klasse,liste[n]->slotName);
Ausgehend von meinem vorherigen POST würde sich der Aufruf von addShortCut so ändern.

Code: Alles auswählen

addShortCut("F12",this,SLOT(toggleFullScreen()),"toggleFullScreen()",tr("Fullscreen ON/OFF"));
Was mir dabei noch nicht gefällt ist die doppelte Angabe des Slots einmal mit SLOT(slotName()) und noch einmal als "slotName()", gibt es eine Möglichkeit das zu vereinfachen?
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Re: Actionlist für IR Remote

Beitrag von archer »

Ist schwierig dir zu folgen, was du eigentlich machen willst.
Ein SLOT ist auch nur eine Methode, die du wie jede andere Aufrufen kannst.
Brauchst du denn diese komplizierte flexibilität?

Vielleicht solltest du deiner Klasse einfach nur eine Methode verpassen der du die
gedrückte Taste übergibst, und die dann die Auswertung übernimmt.

Code: Alles auswählen

void MyClass::irKeyPressed(int aKey)
{
    switch (aKey)
    { 
        case 1:
        .....
    }
}
sigvdr
Beiträge: 100
Registriert: 1. Juli 2008 19:29

Re: Actionlist für IR Remote

Beitrag von sigvdr »

Hallo, der erste Beitrag war dadurch etwas konfus weil ich noch gar nicht so richtig wusste wonach ich suchen soll.
Deshalb noch einmal aus heutiger Sicht:

Basis ist die Tabelle im Anhang, dort kann der Benutzer Tastatur und IR-Fernbedienungstasten einer Aktion zuordnen.

Zuerst gab es nur die Tastatur und ich konnte mit
QShortcut action* = new QShortcut(QKeySequence(keys[1]), (QWidget *)receiver)
connect(action,SIGNAL(activated()),QObject *receiver,SLOT(method()));
einem beliebigen Tastendruck die Aktion receiver->method() zuweisen.

Um zur Laufzeit die Tastaturzuordnung ändern zu können, speichere ich die Zeiger auf QShortcut * in einer Liste und kann mit
action->setKey(QKeySequence(keyStr)) jederzeit den neuen Key der Tastatur zuordnen.

An dieses Verfahren wollte ich mich mit den empfangenen IR Fernbedienungscodes einfach dranhängen und das so, dass ich keine 2 parallel laufende Verfahren synchron halten muss.
So wie ich es jetzt gelöst habe genügt mir jeweils eine Zeile im "Hauptprogramm" um die ganze Sache zu steuern. (Wobei hier "F12" und "F1" nur die Vorbelegung der Tasten ist.)
addShortCut("F12",this,SLOT(toggleFullScreen()),"toggleFullScreen()",tr("Fullscreen ON/OFF"));
Möchte ich später weitere Funktionalität hinzufügen, reicht eine neue Zeile aus.
addShortCut("F1",eineKlasse,SLOT(toggleInfo()),"toggleInfo()",tr("Infoscreen ON/OFF"));

Mir einem extra "switch" "case" - Verfahren für die Fernbedienung (das hatte ich zuerst so) waren Änderungen an mehreren Programmstellen notwendig und somit auch fehleranfällig.

( War das jetzt verständlicher?)
Gruß Sig
Dateianhänge
tabelle.png
tabelle.png (27.03 KiB) 3425 mal betrachtet
Antworten