2008-09-22 17 views
23

De acuerdo con la documentación, el valor de retorno de una ranura no significa nada.
Sin embargo, en el código moc generado veo que si una ranura devuelve un valor, este valor se usa para algo. ¿Alguna idea de lo que hace?Qt: significado del valor de retorno de la ranura?


Aquí hay un ejemplo de lo que estoy hablando. esto se toma del código generado por moc. 'mensaje' es una ranura que no devuelve nada y 'selectPart' se declara como return int.

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

very Nice Pregunta. – SunnyShah

Respuesta

12

Mirando a través de la fuente de Qt Parece que cuando una ranura se llama desde QMetaObject :: InvokeMethod el tipo de retorno y se puede especificar el valor de retorno obtenido. (Eche un vistazo a invokeMethod en la ayuda de Qt)

No pude encontrar muchos ejemplos de esto realmente utilizado en la fuente de Qt. Uno que encontré fue

bool QAbstractItemDelegate::helpEvent 

que es una ranura con un tipo de retorno y se llama desde

QAbstractItemView::viewportEvent 

usando InvokeMethod.

Creo que el valor de retorno para una ranura solo está disponible cuando la función se llama directamente (cuando es una función normal de C++) o cuando se usa invokeMethod. Creo que esto es realmente para funciones Qt internas en lugar de para uso normal en programas que usan Qt.

Editar: Para el caso de la muestra:

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; 

el vector _a es una lista de argumentos que se pasa a qt_metacall. Esto es pasado por QMetaObject :: invokeMethod. Por lo tanto, el valor de retorno en el código generado de moc se guarda y se devuelve a la persona que llama. Entonces, para las interacciones normales de ranura de señal, el valor de retorno no se usa para nada. Sin embargo, el mecanismo existe para que se pueda acceder a los valores devueltos desde las ranuras si se llama la ranura a través de invokeMethod.

12

El valor de retorno sólo es útil si se quiere llamar la ranura como una función normal de usuario:

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

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

Editar: Parece que no es la única forma en que el valor de retorno puede ser utilizado, el método QMetaObject :: InvokeMethod se puede usar para llamar a un espacio y obtener un valor de retorno. Aunque parece que es un poco más complicado de hacer.

6

Es muy útil cuando se trata de un lenguaje dinámico como qtScript JavaScript QtPython, etc. Con este lenguaje/enlaces, puede usar C++ QObject dinamicamente usando la interfaz provista por MetaObject. Como probablemente sepa, solo las señales y las ranuras son analizadas por moc y generan una descripción de MetaObject. Por lo tanto, si está utilizando un QObject de C++ desde un enlace de JavaScript, podrá llamar a solo espacios y querrá el valor de retorno. A menudo, las vinculaciones de Qt para lenguajes dinámicos proporcionan cierta facilidad para acceder al método normal, pero el proceso es definitivamente más trivial.

+1

eche un vistazo a QWebFrame :: addToJavaScriptWindowObject y piense cómo dejar que el javascript en ese marco obtenga datos del objeto que ha agregado. – FxIII

4

Todas las ranuras están expuestas en QMetaObject, donde se puede acceder al objeto a través de una interfaz reflectante.

Por ejemplo, QMetaObject::invokeMethod() toma un parámetro QGenericReturnArgument. Así que creo que esto no es para el uso explícito de espacios, sino para la invocación dinámica de métodos en general. (Hay otras formas de exponer los métodos a QMetaObject que convertirlos en espacios.)

La función invokeMethod es, por ejemplo, utilizada por varios lenguajes dinámicos como QML y Javascript para llamar a los métodos de QObject:s. (También hay un puente Python-Qt llama PythonQt que utiliza esto. No debe confundirse con PyQt, que es una envoltura completa.)

El valor de retorno se utiliza al realizar llamadas syncrhonous a través de hilos dentro de una aplicación Qt (apoyado a través InvokeMethod y conexión configuración del tipo de Qt::BlockingQueuedConnection, que tiene la siguiente documentación:

Igual que QueuedConnection, excepto los bloques de rosca actual hasta que el rendimientos de ranura Este tipo de conexión sólo debe utilizarse en el que el emisor y el receptor son. en diferentes hilos. Nota: La violación de esta regla puede hacer que su aplicación se estanque.

Cuestiones relacionadas