c++ - smart - Qt: significado del valor de retorno de la ranura?
solidity español (4)
Al mirar a través de la fuente de Qt, parece que cuando se llama a un intervalo desde QMetaObject :: invokeMethod, se puede especificar el tipo de retorno y obtener el valor de retorno. (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 devolución y se llama desde
QAbstractItemView::viewportEvent
usando invokeMethod.
Creo que el valor de retorno de 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 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.
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?
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;
El valor de retorno solo es útil si desea llamar a la ranura como una función de miembro normal:
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 esa no es la única forma en que se puede usar el valor de retorno, 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.Es muy útil cuando maneja 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.
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 métodos de QObject:s
. (También hay un puente Python-Qt llamado PythonQt que usa esto. No se debe confundir con PyQt , que es un contenedor completo).
El valor devuelto se usa cuando se realizan llamadas sincrónicas a través de subprocesos dentro de una aplicación Qt (se admite a través de invokeMethod y se establece el tipo de conexión en Qt::BlockingQueuedConnection
, que tiene la siguiente documentación:
Igual que QueuedConnection, excepto los bloques de hilos actuales hasta que la ranura regrese. Este tipo de conexión solo debe usarse cuando el emisor y el receptor están en diferentes hilos. Nota: la violación de esta regla puede hacer que su aplicación se estanque.