2010-11-24 14 views
1

Ich möchte eine Funktion als Slot ohne Klasse verbinden, kann ich dies tun:Connect ohne Objekt

void update() { } 

int main() 
{ 
    QTimer timer = ...; 
    QObject::connect(timer, SIGNAL(timeout()), SLOT(update())); 
    return 0; 
} 

Der Compiler sagt, dass es unmöglich ist, ohne Objekt.

Antwort

2

AFAIK, Sie können nur Signale mit Steckplätzen verbinden, und Steckplätze können nur als Mitgliedsfunktionen eines Q_OBJECT existieren.

Während viele Leute sich auf die Unterschiede zwischen Templates vs Moc zwischen Qt-Signalen und Boost :: -Signalen oder GTKmm-Signalen konzentrieren, ist dies der Unterschied, um den ich mich letztlich mehr sorge. Qt-Signale sind nicht so ausdrucksstark und verursachen mehr Abhängigkeiten als ich möchte.

Ich benutze immer noch Qt, aber das ist nur, weil GTKmm Zugänglichkeit auf Win32-Systemen vollständig fehlt.

Was Sie tun können, ist natürlich, eine Unterklasse von QTimer zu machen, die mit ihrem eigenen Timeout-Signal mit einem Steckplatz verbunden ist, der ein boost :: -Signal erzeugt, das Sie mit Ihrer externen Funktion verbinden können. Achten Sie auf die Probleme bei der Verwendung von Boost-Signalen in Qt, aber ich benutze nur Signale2, um es vollständig zu vermeiden UND ich bekomme Thread-Sicherheit.

+1

Es ist vielleicht erwähnenswert, dass diese Funktionalität in Qt 5 eingeführt wird http://developer.qt.nokia .com/wiki/Neue_Signal_Slot_Syntax – leinir

1

Sie müssen, dass Qt den Steckplatz erkennen. Um dies zu tun, musst du eine Klasse bilden. Also würde ich sagen, unmöglich.