Seite 1 von 1

Funktion als Callback registrieren beim Verwenden von OpenGL

Verfasst: 27. Mai 2006 15:37
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 :)

Verfasst: 27. Mai 2006 15:42
von Querdenker
Hi,

wieso legst Du die Methode nicht als Slot an? Die kann jeder anfunken.
Nur mal als Denkanstoss.

Verfasst: 27. Mai 2006 15:46
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.

Verfasst: 27. Mai 2006 16:47
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....