[ fromfile: invokemethod.xml id: invokemethod ]
Qt's capability to connect signals to slots requires a mechanism to indirectly call the slots in a type-safe way, by name.
When a slot is called, it is actually done by invokeMethod()
.
Example 12.16 shows how it accepts a string for the method name.
In addition to slots
, regular methods marked Q_INVOKABLE
can be invoked indirectly this way.
Example 12.16. src/reflection/invokemethod/autosaver.cpp
void AutoSaver::saveIfNecessary() { if (!QMetaObject::invokeMethod(parent(), "save")) { qWarning() << "AutoSaver: error invoking save() on parent"; } }
<include src="src/reflection/invokemethod/autosaver.cpp" href="src/reflection/invokemethod/autosaver.cpp" id="invokemethod-cpp" mode="cpp"/>
Similar to QObject::connect()
, invokeMethod()
takes an optional argument, the Qt::ConnectionType
, which enables you to decide if you want synchronous or asynchronous invocation.
The default, Qt::AutoConnection
, executes the slot synchronously when the sender and receiver are in the same thread.
To pass typed arguments to a function via invokeMethod()
, you can create values with the Q_ARG
macro Example 12.17,
which returns a QGenericArgument, encapsulating type and value information for a single argument.
Example 12.17. src/reflection/invokemethod/arguments.cpp
QByteArray buffer= ... ; const bool b = QMetaObject::invokeMethod(m_thread, "calculateSpectrum", Qt::AutoConnection, Q_ARG(QByteArray, buffer), Q_ARG(int, format.frequency()), Q_ARG(int, bytesPerSample));
<include src="src/reflection/invokemethod/arguments.cpp" href="src/reflection/invokemethod/arguments.cpp" id="invokemethod-args-cpp" mode="cpp"/>
Generated: 2012-03-02 | © 2012 Alan Ezust and Paul Ezust. |