Complementos (extensiones)
Extensions es una biblioteca din谩mica compartida dise帽ada para cargarse durante la ejecuci贸n de la aplicaci贸n principal, que necesariamente debe implementar al menos una interfaz especial.
Las extensiones se dividen en dos tipos:
- Para Qt
- Para aplicaciones nativas
Vamos a descubrir c贸mo crear su propio sistema de extensi贸n y las extensiones en s铆.
La comunicaci贸n con la extensi贸n se lleva a cabo utilizando la interfaz (se帽ales, slots y m茅todos de clase). La aplicaci贸n carga la extensi贸n utilizando la clase QPluginLoader . Para cargar la extensi贸n, se utiliza el m茅todo instancia () , que crea un objeto de extensi贸n y le devuelve un puntero. El m茅todo unload () se usa para descargar la extensi贸n.
Parte 1
En el primer ejemplo, cree una extensi贸n que usar谩 una funci贸n (algoritmo, f贸rmula) de la extensi贸n.
El esquema visual del proyecto tendr谩 el siguiente aspecto.

Etapa 1:
El primer paso es crear una clase de interfaz heredada de QObject, como interfaz habr谩 un m茅todo que acepte una variable de tipo QString y devuelva la misma cadena en may煤sculas. Usando la macro Q_DECLARE_INTERFACE, establecemos el identificador de las interfaces, el compilador c genera metainformaci贸n para la cadena del identificador. Este m贸dulo es el protocolo de comunicaci贸n entre el complemento y el programa principal y se utilizar谩 en el proyecto del complemento y en el proyecto principal.
La clase se ver谩 de la siguiente manera.
Etapa 2:
Creemos una aplicaci贸n b谩sica que descargar谩 la extensi贸n. Al presionar el bot贸n, la extensi贸n se buscar谩 y se cargar谩 en el sistema. Adem谩s a trav茅s de la interfaz usaremos nuestra funci贸n.
Aplicaci贸n base:
mainproject.h
mainproject.cpp
Etapa 3:
Al crear una extensi贸n, lo primero que debe hacer es cambiar el tipo de proyecto que se est谩 construyendo en el archivo pro, para esto debe agregar la siguiente l铆nea TEMPLATE = lib, y establecer la configuraci贸n del proyecto para la extensi贸n del complemento CONFIG + =.
upperstringplugin.pro
#------------------------------------------------- # # Project created by QtCreator 2019-04-03T11:35:18 # #------------------------------------------------- QT += core greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = upperStringPlugin TEMPLATE = lib CONFIG += plugin DESTDIR = ../Plugins DEFINES += QT_DEPRECATED_WARNINGS CONFIG += c++11 SOURCES += \ upperstringplugin.cpp HEADERS += \ upperstringplugin.h \ interface.h
A continuaci贸n, creamos una clase para la futura extensi贸n, la clase debe heredarse de la clase de interfaces. Macro Q_INTERFACES , necesita el compilador para generar toda la metainformaci贸n necesaria para la extensi贸n. La macro Q_PLUGIN_METADATA () establece el punto de entrada a la extensi贸n y el acceso a la biblioteca Qt. Tambi茅n debe crear un archivo inteface.json con metainformaci贸n (el archivo debe estar en la ra铆z del proyecto), en nuestro caso no hay informaci贸n all铆, as铆 que simplemente escriba comillas vac铆as {} en el archivo.
upperstringplugin.h
upperstringplugin.cpp
En la salida de compilar el proyecto, obtenemos un archivo con la extensi贸n .so, movemos este archivo a la carpeta Plugins del proyecto principal y lo iniciamos. En este caso, la extensi贸n se carga en el programa principal y se crea un 煤nico objeto de extensi贸n. Si intenta reutilizar la funci贸n instancia (), la funci贸n devolver谩 un puntero al objeto de extensi贸n ya creado.
Ejecuci贸n del programa

Parte 2
Para complicar nuestra tarea, ahora necesitamos que la extensi贸n sea un widget y la capacidad de crear varios de estos widgets. El programa principal recibir谩 mensajes de complementos y enviar谩 una respuesta. Crearemos nuevos proyectos, en la primera etapa necesitaremos dos clases de interfaces, una ser谩 responsable de cargar la extensi贸n y crear el widget, y la otra para el funcionamiento del widget en s铆.
El esquema del proyecto tendr谩 el siguiente aspecto:

Etapa 1:
La primera clase de interfaz tendr谩 dos funciones: obtener el nombre del complemento y obtener el widget del complemento. El nombre del complemento se almacenar谩 para su identificaci贸n en el sistema. Agregaremos el widget de complemento a las ventanas MDI de la aplicaci贸n principal.
La segunda clase es el widget gr谩fico en s铆, se hereda de QWidget, aqu铆 hemos especificado las funciones que necesitamos, el widget recibir谩 un mensaje y lo enviar谩 al programa principal.
interfaz.h
Etapa 2:
El programa principal consta de una ventana MDI, en la que hay un widget principal para recibir mensajes de complementos y ventanas adicionales que aparecen din谩micamente a medida que se llaman los complementos.
Al crear un widget de complemento, conectamos la se帽al del complemento a la ranura y, mediante la funci贸n remitente (), obtenemos un puntero al complemento que envi贸 el mensaje. Colocamos el widget creado en la ventana MDI, y el objeto del complemento en s铆 mismo puede descargarse del sistema.
mainproject.h
mainproject.cpp
La ventana principal acepta el mensaje y lo muestra.
mainwidget.h
mainwidget.cpp
Etapa 2:
Creamos un complemento, su idea es que sea una f谩brica para crear un widget.
plugin.h
plugin.cpp
Widget creado por el complemento.
texttranferwidget.h
texttranferwidget.cpp
La salida del programa principal:
