2008-09-22 9 views
23

Gemäß der Dokumentation bedeutet der Rückgabewert von einem Steckplatz nichts.
Doch im generierten Code moc Ich sehe, dass, wenn ein Schlitz einen Wert zurückgibt dieser Wert für etwas verwendet wird. Irgendeine Idee, was es macht?Qt: Bedeutung der Slot-Rückgabewert?


Hier ist ein Beispiel für das, worüber ich spreche. Dies wird aus einem Code entnommen, der von moc generiert wurde. 'Nachricht' ist ein Slot, der nichts zurückgibt und 'selectPart' wird als int zurückgegeben.

case 7: message((*reinterpret_cast< const QString(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break; 
case 8: { int _r = selectPart((*reinterpret_cast< AppObject*(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); 
    if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; 
+0

sehr nette Frage. – SunnyShah

Antwort

12

Blick durch die Qt Quelle scheint es, dass, wenn ein Schlitz von QMetaObject aufgerufen :: InvokeMethod des Rückgabetyp angegeben werden kann, und der Rückgabewert erhalten. (Werfen Sie einen Blick auf InvokeMethod in Hilfe Qt)

ich nicht viele Beispiele dafür finden könnte tatsächlich in der Quelle Qt verwendet wird. Ein Ich war

bool QAbstractItemDelegate::helpEvent 

gefunden, die einen Schlitz mit einem Rückgabetyp ist und von

QAbstractItemView::viewportEvent 

mit InvokeMethod genannt wird.

Ich denke, dass der Rückgabewert für einen Schlitz nur zur Verfügung, wenn die Funktion direkt aufgerufen wird (wenn es sich um eine normale C++ Funktion ist), oder wenn InvokeMethod verwenden. Ich denke, das ist wirklich für interne Qt-Funktionen gedacht und nicht für den normalen Gebrauch in Programmen, die Qt benutzen.

Edit: Für das Beispielfall:

case 8: { int _r = selectPart((*reinterpret_cast< AppObject*(*)>(_a[1])), *reinterpret_cast< int(*)>(_a[2]))); 
if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; 

der Vektor _a ist eine Liste der Argumente, die qt_metacall geben wird. Dies wird von QMetaObject :: invokeMethod übergeben. So wird der Rückgabewert im moc generierten Code gespeichert und an den Aufrufer zurückgegeben. Daher wird der Rückgabewert für normale Signal-Slot-Interaktionen überhaupt nicht verwendet. Der Mechanismus existiert jedoch so, dass auf die Rückgabewerte von Slots zugegriffen werden kann, wenn der Slot über invokeMethod aufgerufen wird.

12

Der Rückgabewert ist nur dann sinnvoll, wenn Sie den Schlitz als normale Member-Funktion aufgerufen werden sollen:

class MyClass : public QObject { 
    Q_OBJECT 
public: 
    MyClass(QObject* parent); 
    void Something(); 
public Q_SLOTS: 
    int Other(); 
};

void MyClass::Something() { int res = this->Other(); ... }

Edit: Es scheint, das ist nicht der einzige Weg, der Rückgabewert verwendet werden kann, die QMetaObject :: InvokeMethod Methode kann verwendet werden, um einen Slot aufzurufen und einen Rückgabewert zu erhalten. Obwohl es scheint, ist es ein bisschen komplizierter zu tun.

6

Es ist sehr nützlich, wenn Sie mit einem dynamischen Sprache wie zum QtScript JavaScript QtPython beschäftigen und so weiter. Mit dieser Sprache/Bindungen können Sie C++ QObject dynamisch mit der von MetaObject bereitgestellten Schnittstelle verwenden. Wie Sie wahrscheinlich wissen, werden nur Signale und Slots von moc analysiert und erzeugen MetaObject-Beschreibungen. Wenn Sie also ein C++ - QObject aus einer JavaScript-Bindung verwenden, können Sie nur Slots aufrufen und den Rückgabewert erhalten. Oft bieten Qt-Bindings für dynamische Sprachen einige Möglichkeiten, um auf normale Methoden zuzugreifen, aber der Prozess ist definitiv triky.

+1

werfen Sie einen Blick auf QWebFrame :: addToJavaScriptWindowObject und überlegen Sie, wie Sie das Javascript in diesem Frame zum Abrufen von Daten aus dem von Ihnen hinzugefügten Objekt freigeben können. – FxIII

4

Alle Schlitze sind in QMetaObject ausgesetzt ist, wo sich das Objekt über eine reflektierende Schnittstelle zugegriffen werden.

Zum Beispiel nimmt QMetaObject::invokeMethod() einen QGenericReturnArgument Parameter. Also glaube ich, dass dies nicht für die explizite Slot-Verwendung, sondern für den dynamischen Aufruf von Methoden im Allgemeinen gilt. (Es gibt andere Möglichkeiten, Methoden für QMetaObject verfügbar zu machen, als sie in Slots zu machen.)

Die Funktion invokeMethod wird zum Beispiel von verschiedenen dynamischen Sprachen wie QML und Javascript verwendet, um Methoden von QObject:s aufzurufen. (Es gibt auch eine Python-Qt Brücke PythonQt genannt, die diese verwenden. Nicht mit PyQt verwechselt werden, die eine vollständigen Umhüllung ist.)

Der Rückgabewert wird verwendet, wenn syncrhonous Anrufe über Threads in einer Qt-Anwendung zu machen (unterstützt durch InvokeMethod Satz und Verbindungstyp Qt::BlockingQueuedConnection, die die folgende Dokumentation hat:

Selber wie QueuedConnection, außer der aktuellen Thread blockiert, bis der Schlitz kehrt Diese Verbindungsart nur verwendet werden soll, wo der Sender und Empfänger ist. in verschiedene Gewinde. Hinweis: Wenn Sie diese Regel verletzen, kann Ihre Anwendung zum Deadlock führen.