Funktion als Callback registrieren beim Verwenden von OpenGL

Alles rund um die Programmierung mit Qt
Antworten
MadsMaus
Beiträge: 12
Registriert: 18. Mai 2006 12:50
Kontaktdaten:

Funktion als Callback registrieren beim Verwenden von OpenGL

Beitrag von MadsMaus »

Ich schreibe zur Zeit an einer Belegarbeit fürs Studium und entwickele ein Mensch-ärger-dich-nicht Spiel in QT und OpenGL. Jetzt habe ich meine Ludo-Klasse angelegt, deren Klassenmethoden als Callback-Funktionen bei glut (z.B. glutKeyboardFunc()) registriert werden sollen.

Dass das als Klassenmethode nicht geht, habe ich auch schon gemerkt, und mir erstmal eine Übergangslösung mit Hilfe globaler Klassen geschaffen:

Code: Alles auswählen

static void ludoKeyFunctor (unsigned char inkey, int px, int py) {
  qDebug("Taste wurde gedrückt");
  if(pt2Obj!=0)
    pt2Obj->key(inkey, px, py);
}
Wobei pt2Obj den Pointer auf das ludo-Objekt enthält. Die Funktion ist dafür gedacht, dass wenn eine Taste gedrückt wurde, diese Funktion angesprungen ist, und das Ereignis an die Klassenmethode weitergeleitet wird.

Code: Alles auswählen

glutKeyboardFunc(&ludoKeyFunctor);
Jedoch wird mir beim Ausführen des Programms nie meine Testausgabe ausgegeben. D.h. diese Funktion wird nie aufgerufen.
Ist es in Qt überhaupt möglich, diese glut-Funktionalitäten zu nutzen? und wenn ja, was ist hier mein Fehler?

dankeschön :)
Querdenker
Beiträge: 99
Registriert: 1. Dezember 2005 17:44
Wohnort: Karlsruhe

Beitrag von Querdenker »

Hi,

wieso legst Du die Methode nicht als Slot an? Die kann jeder anfunken.
Nur mal als Denkanstoss.
e Grüssle au
Q... ;)
MadsMaus
Beiträge: 12
Registriert: 18. Mai 2006 12:50
Kontaktdaten:

Beitrag von MadsMaus »

Das Problem dabei ist, dass die glutKeyboardFunc spezielle Funktionen benötigt, die übergeben werden müssen. Die müssen der Form void (*)(unsigned char, int, int) entsprechen... Deswegen geh ich hierbei über diese globale Funktion.

Das Tastenbeispiel ist jetzt auch nur der Anschauung halber, eigentlich sind dafür spezielle Mausfunktionen vorgesehen, die speziell an das spiel angepasst sind.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

es gibt noch emit (int data)
http://doc.trolltech.com/3.3/signalsandslots.html auch im qt4
die signale und daten senden....

dann gibt es noch QActionGroup.
die hatte ich gestern vor augen...

Code: Alles auswählen


    makealignmentChanged(para_21->alignment());
    QActionGroup *grp = new QActionGroup(this);
    connect(grp, SIGNAL(triggered(QAction *)), this, SLOT(maketextAlign(QAction *)));
    
    actionAlignLeft = new QAction(QIcon(":/img/img/text_editor/textleft.png"), tr("Allineamento &Sinistra"),grp);
    actionAlignLeft->setShortcut(Qt::CTRL + Qt::Key_S);
    actionAlignLeft->setCheckable(true);
    
    actionAlignRight = new QAction(QIcon(":/img/img/text_editor/textright.png"), tr("Allineamento &Destra"),grp);
    actionAlignRight->setShortcut(Qt::CTRL + Qt::Key_D);
    actionAlignRight->setCheckable(true);
    
    actionAlignCenter = new QAction(QIcon(":/img/img/text_editor/textcenter.png"), tr("C&entrato"),grp);
    actionAlignCenter->setShortcut(Qt::CTRL + Qt::Key_E);
    actionAlignCenter->setCheckable(true);
    
    actionAlignJustify = new QAction(QIcon(":/img/img/text_editor/textjustify.png"), tr("&Giustificato"),grp);
    actionAlignJustify->setShortcut(Qt::CTRL + Qt::Key_G);
    actionAlignJustify->setCheckable(true);

--------------------

void Tab_Addo::maketextAlign(QAction *a)
{
    if (a == actionAlignLeft)
        para_21->setAlignment(Qt::AlignLeft);
    else if (a == actionAlignCenter)
        para_21->setAlignment(Qt::AlignHCenter);
    else if (a == actionAlignRight)
        para_21->setAlignment(Qt::AlignRight);
    else if (a == actionAlignJustify)
        para_21->setAlignment(Qt::AlignJustify);
}


Mann kan auch callback im C machen so wie es die statische sqlite libs macht

einfach deklarieren das eine C stelle kommt....

es gibt massenweise an methoden....
Antworten