El proyecto cmake de C++ presenta qt6 y un tutorial rápido

prefacio

En el desarrollo de software moderno, la interfaz gráfica de usuario (GUI) multiplataforma y las capacidades de visualización se han vuelto muy importantes. Qt y Qt Quick (basado en QML) son herramientas potentes y flexibles que ayudan a los desarrolladores a crear rápidamente excelentes aplicaciones. Sin embargo, cuando ya tiene un proyecto basado en C++ y CMake, la introducción de Qt y Qt Quick puede requerir cierta orientación.

Este tutorial ayudará a los desarrolladores con conocimientos básicos de C++ y CMake a introducir Qt y Qt Quick en proyectos CMake existentes. Describiremos cómo configurar el archivo CMakeLists.txt para usar módulos Qt y cómo lograr una interacción entre idiomas entre el código C++ y QML. A través de este tutorial, podrá aplicar Qt y Qt Quick a sus proyectos para crear visualizaciones e interfaces de usuario atractivas.

Introducción a QML

QML es el lenguaje de programación declarativo de Qt para diseñar e implementar interfaces de usuario multiplataforma. Comparado con Qt Widgets, QML tiene las siguientes ventajas:

  1. Sintaxis limpia : QML tiene una sintaxis limpia y legible que hace que la creación y modificación de interfaces de usuario sean intuitivas. Le permite lograr la misma funcionalidad con menos código, mejorando así la eficiencia del desarrollo.
  2. Potente compatibilidad con animaciones y efectos especiales : QML tiene una amplia compatibilidad integrada con animaciones y efectos especiales, lo que facilita la creación de atractivas interfaces de usuario. Puede agregar fácilmente efectos de animación a los elementos de la interfaz para mejorar la experiencia del usuario.
  3. Compatibilidad multiplataforma : QML puede admitir diferentes plataformas y dispositivos, lo que facilita el desarrollo de aplicaciones multiplataforma. Con QML, puede crear interfaces de usuario unificadas para dispositivos integrados, móviles y de escritorio.
  4. Programación orientada a objetos : QML admite la programación orientada a objetos, lo que le permite crear componentes y módulos reutilizables. Esto ayuda a mejorar la modularidad y la mantenibilidad del código.
  5. Estrecha integración con C++ : QML se puede integrar fácilmente con código C++, lo que le permite utilizar funciones implementadas en C++ en la interfaz QML. Esto hace que QML sea ideal para usar con proyectos C++ existentes.

A pesar de estas ventajas, QML no siempre es más fácil de implementar que Qt Widgets. Lo fácil que es entre los dos realmente depende de sus necesidades y experiencia. Qt Widgets puede ser más adecuado en algunos escenarios, especialmente para aplicaciones de escritorio tradicionales y escenarios con requisitos de alto rendimiento.

En general, QML tiene ventajas en muchos sentidos, pero debe elegir la tecnología más adecuada según las necesidades de su proyecto y sus preferencias personales. Si está interesado en QML, le sugiero que intente implementar algunos proyectos simples usándolo para comprender mejor sus características y ventajas.

Ejercicio nivel C++

  1. Uso de Qt Widgets : aunque QML es un poderoso lenguaje de diseño de interfaz, también puede crear excelentes interfaces usando Qt Widgets, mientras usa más código C++. Al usar Qt Widgets, puede aplicar y mejorar sus habilidades de programación en C++ en proyectos reales.
  2. Combinación de C++ y QML : QML y C++ se pueden integrar bien. Puede escribir la lógica central y los algoritmos de su aplicación en C++ y luego exponer estas funciones a QML para su uso en la interfaz de usuario. De esta manera, no solo puede ejercitar su capacidad de programación en C++, sino también aprender a usar QML.
  3. Participe en proyectos de código abierto : Unirse a un proyecto de código abierto usando C++ le permite aplicar y mejorar sus habilidades de programación en C++ en proyectos reales. Participar en proyectos de código abierto puede ayudarlo a aprender más sobre las mejores prácticas y técnicas de C++, al mismo tiempo que expande su red técnica.
  4. Lea libros y tutoriales relacionados con C++ : leer libros y tutoriales de C++ de alta calidad puede ayudarlo a obtener una comprensión profunda de las características y las mejores prácticas del lenguaje C++. Algunos libros clásicos de C++, como "Effective C++", "C++ Primer" y "The C++ Programming Language", son buenos libros que vale la pena leer.
  5. Resuelva desafíos y problemas de programación : busque desafíos y problemas de programación en C++ en línea, como preguntas de programación en plataformas como LeetCode y HackerRank. Estos desafíos pueden ayudarlo a ejercitar sus habilidades de programación y mejorar su velocidad y eficiencia en la resolución de problemas.
  6. Aprenda nuevas funciones de C++ : el lenguaje C++ está en constante evolución y se introducen nuevos estándares y funciones con regularidad. Prestar atención y aprender estas nuevas funciones puede mantener actualizado su conocimiento de C++ y mejorar sus habilidades de programación al mismo tiempo.

Al adoptar estas estrategias, puede practicar y mejorar sus habilidades de programación en C++ en proyectos reales. Al mismo tiempo, aprender QML puede ayudarlo a responder mejor a diferentes tipos de requisitos de proyectos y hacerlo más competitivo en el campo del desarrollo de software. ¡Buena suerte con tu aprendizaje de C++ y QML!

método de modificación cmake

Método 1 (qt6_add_resources)

Para llevar un proyecto CMake de C++ existente al entorno Qt6 y usar Qt y QML, debe realizar los siguientes pasos:

  1. Instale Qt6 : si no ha instalado Qt6, descárguelo e instálelo desde el sitio web oficial. Asegúrese de tener instalado el módulo Qt6 CMake.
  2. Modifique CMakeLists.txt : en su proyecto C++ CMake, abra CMakeLists.txtel archivo. Primero, asegúrese de encontrar el paquete Qt6, luego enlace a los módulos Qt6 requeridos. Por ejemplo, si necesita usar los módulos Qt6 Core, Gui y Quick, puede agregar lo siguiente:
    find_package(Qt6 COMPONENTS Core Gui Quick REQUIRED)
    
    Luego, vincule estos módulos a su objetivo (por ejemplo, su ejecutable):
    target_link_libraries(your_target_name PRIVATE Qt6::Core Qt6::Gui Qt6::Quick)
    
  3. Agregue archivos QML : cree una carpeta QML en el directorio del proyecto y coloque todos los archivos QML en esta carpeta. Luego, CMakeLists.txtuse file(GLOB ...)el comando para agregar estos archivos al proyecto. Por ejemplo:
    file(GLOB QML_FILES qml/*.qml)
    
    Agregue el archivo QML al archivo de recursos del ejecutable:
    qt6_add_resources(your_target_name "qml"
        PREFIX
            "/"
        FILES
            ${QML_FILES}
    )
    
  4. Cree la entrada principalmain.cpp : cree un archivo en su proyecto C++ (si aún no lo ha creado) y agregue el siguiente código para configurar el entorno Qt y QML:
    #include <QGuiApplication>
    #include <QQmlApplicationEngine>
    
    int main(int argc, char *argv[])
    {
          
          
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    
        QGuiApplication app(argc, argv);
    
        QQmlApplicationEngine engine;
        const QUrl url(QStringLiteral("qrc:/main.qml"));
        QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                         &app, [url](QObject *obj, const QUrl &objUrl) {
          
          
            if (!obj && url == objUrl)
                QCoreApplication::exit(-1);
        }, Qt::QueuedConnection);
        engine.load(url);
    
        return app.exec();
    }
    
  5. Registrar clases de C++ : en main.cpp, use qmlRegisterTypela función para registrar sus clases de C++ para que puedan usarse en QML. Por ejemplo:
    qmlRegisterType<YourCppClass>("com.example.yourclassname", 1, 0, "YourCppClass");
    
    Luego, en el archivo QML, puede importar y usar su clase C++ a través de:
    import com.example.yourclassname 1.0
    
    YourCppClass {
        // ...
    }
    
  6. Compilar y ejecutar : ahora que su proyecto C++ CMake ha integrado Qt6 y QML, puede compilarlo y ejecutarlo. Si todo está bien, debería poder ver su interfaz QML.

Método 2 (qt_add_qml_module)

Por supuesto, también puede usar qt_add_qml_modulefunciones para agregar módulos QML en proyectos CMake. Este es un método conveniente que simplifica la adición de recursos QML. Aquí están qt_add_qml_modulelos pasos de cómo usarlo:

  1. Instale Qt6 : si no ha instalado Qt6, descárguelo e instálelo desde el sitio web oficial. Asegúrese de tener instalado el módulo Qt6 CMake.
  2. Modifique CMakeLists.txt : en su proyecto C++ CMake, abra CMakeLists.txtel archivo. Primero, asegúrese de encontrar el paquete Qt6, luego enlace a los módulos Qt6 requeridos. Por ejemplo, si necesita usar los módulos Qt6 Core, Gui y Quick, puede agregar lo siguiente:
    find_package(Qt6 COMPONENTS Core Gui Quick REQUIRED)
    
    Luego, vincule estos módulos a su objetivo (por ejemplo, su ejecutable):
    target_link_libraries(your_target_name PRIVATE Qt6::Core Qt6::Gui Qt6::Quick)
    
  3. Agregue archivos QML : cree una carpeta QML en el directorio del proyecto y coloque todos los archivos QML en esta carpeta.
  4. Use qt_add_qml_module : CMakeLists.txten, use qt_add_qml_modulela función para agregar archivos QML al proyecto. Por ejemplo:
    qt_add_qml_module(your_target_name
        URI com.example.yourclassname
        VERSION 1.0
        QML_FILES
            qml/main.qml
    )
    
    ¿ Dónde your_target_nameestá el nombre de destino de su ejecutable, URIespecifica el identificador del módulo, VERSIONestablece la versión del módulo y QML_FILESenumera todos los archivos QML.
  5. Cree la entrada principalmain.cpp : cree un archivo en su proyecto C++ (si aún no lo ha creado) y agregue el siguiente código para configurar el entorno Qt y QML:
    #include <QGuiApplication>
    #include <QQmlApplicationEngine>
    
    int main(int argc, char *argv[])
    {
          
          
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    
        QGuiApplication app(argc, argv);
    
        QQmlApplicationEngine engine;
        const QUrl url(QStringLiteral("qrc:/qml/main.qml"));
        QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                         &app, [url](QObject *obj, const QUrl &objUrl) {
          
          
            if (!obj && url == objUrl)
                QCoreApplication::exit(-1);
        }, Qt::QueuedConnection);
        engine.load(url);
    
        return app.exec();
    }
    
  6. Registrar clases de C++ : en main.cpp, use qmlRegisterTypela función para registrar sus clases de C++ para que puedan usarse en QML. Por ejemplo:
    qmlRegisterType<YourCppClass>("com.example.yourclassname", 1, 0, "YourCppClass");
    
    Luego, en el archivo QML, puede importar y usar su clase C++ a través de:
    import com.example.yourclassname 1.0
    
    YourCppClass {
        // ...
    

Otros conocimientos relevantes

¿ Por qué <target_name>_other_files?

El problema es que qt_add_qml_modulela función crea un <target_name>_other_filesobjetivo auxiliar nombrado al agregar un archivo QML al proyecto. Este objeto auxiliar se usa para mostrar archivos QML y otros archivos relacionados en Qt Creator. Este destino no tiene efecto en el proceso de compilación y no se generan archivos binarios. Es solo para una mejor organización y visualización de archivos en Qt Creator.

qt_standard_project_setup()función

qt_standard_project_setup()función. Esta función configura internamente CMake para generar una estructura de directorios más limpia para los proyectos Qt, lo que significa que maneja automáticamente la adición de módulos y recursos QML sin generar objetivos auxiliares adicionales.

qt_standard_project_setup()La función tiene configurada la administración de recursos para el proyecto qt_add_qml_module()antes de , por lo que no ve ningún <target_name>_other_filesobjetivo.

Si desea utilizar una configuración similar en su propio proyecto, find_package()intente add_executable()agregar qt_standard_project_setup()la función llamar y . De esta manera, obtiene una estructura de directorios más limpia mientras conserva la funcionalidad de administración del módulo QML de Qt Creator.

Tenga en cuenta que qt_standard_project_setup()las funciones son una característica experimental de Qt y pueden cambiarse o eliminarse en futuras versiones de Qt. Cuando utilice esta función, asegúrese de comprender los detalles de implementación y esté preparado para realizar los ajustes necesarios en futuras versiones de Qt.

qt_add_qml_module()qt6_add_resources()y la diferencia en la manera

qt_add_qml_module()y qt6_add_resources()ambos pueden agregar archivos QML y otros recursos a un proyecto, pero difieren en su funcionalidad y objetivos:

  1. qt_add_qml_module()
    • está diseñado para simplificar la creación y gestión de módulos QML.
    • Genera automáticamente archivos QRC.
    • Se puede especificar el URI y la versión del módulo, lo cual es útil para usar módulos QML en proyectos.
    • <target_name>_other_filesSe crea un objetivo secundario para mostrar archivos QML y otros archivos relacionados en Qt Creator para una fácil visualización y administración.
    • Es más adecuado para proyectos que contienen módulos QML y puede gestionar automáticamente el registro y la gestión de recursos de los módulos QML.
  2. qt6_add_resources()
    • es una función más general para agregar recursos (como imágenes, archivos de texto, etc.) a un proyecto.
    • El archivo QRC debe crearse manualmente.
    • No se crean objetivos <target_name>_other_filesauxiliares , por lo que no se muestran archivos adicionales en Qt Creator.
    • Diseñado para proyectos que no necesitan las funciones del módulo QML o que requieren un control más detallado sobre la administración de recursos.

En general, se recomienda si su proyecto necesita usar módulos QML y desea simplificar la creación y administración de módulos qt_add_qml_module(). Si su proyecto solo necesita agregar archivos QML y otros recursos al proyecto sin usar la función del módulo QML, o si desea tener más control, entonces qt6_add_resources()es opción.

La diferencia entre const QUrl url(u"qrc:///Main.qml"_qs); y const QUrl url(QStringLiteral("qrc:///Main.qml"));

La principal diferencia entre los dos es la representación y codificación de los literales de cadena:

  1. const QUrl url(u"qrc:///Main.qml"_qs);

    Aquí, uel prefijo indica que el valor literal de la cadena es una cadena Unicode codificada en UTF-16. _qsEl literal definido por el usuario (Literal definido por el usuario, UDL) detrás de la cadena es QStringun método conveniente proporcionado por Qt para convertir un valor literal de cadena en un tipo. En este caso, el literal de cadena es una cadena Unicode codificada en UTF-16 que eventualmente se convierte al QStringtipo .

  2. const QUrl url(QStringLiteral("qrc:///Main.qml"));

    Aquí, QStringLiteralhay una macro Qt que convierte un literal de cadena en un objeto de QStringtipo . La ventaja de esta macro es que evita la creación QStringde objetos , lo que mejora el rendimiento. En este caso, el literal de cadena es una cadena ordinaria, QStringLiteralconvertida QStringal tipo .

En el uso real, ambos métodos pueden lograr la misma función, es decir, crear un QUrlobjeto para representar la URL del archivo de recursos. Es solo que manejan los literales de cadena de forma ligeramente diferente en tiempo de compilación. QStringLiteralEl método se recomienda por su rendimiento y simplicidad .

qt tipo de principio de búsqueda qrc

Cuando hace referencia a un archivo de recursos con qrc:el prefijo , Qt encuentra automáticamente todos los archivos de recursos registrados. Durante el proceso de compilación, qt_add_resources()la qt6_add_resources()función resources.qrccompilará archivos de recursos (como ) en archivos binarios y los integrará en el ejecutable final. Cuando hace referencia a un archivo de recursos con qrc:el prefijo , Qt busca entradas coincidentes en todos los archivos de recursos registrados.

Por lo tanto, no necesita especificar cuando se hace referencia a archivos de recursos resources.qrc, porque Qt encontrará automáticamente el correcto entre todos los archivos de recursos registrados. Si tiene varios .qrcarchivos , solo asegúrese de que estén registrados correctamente a través qt_add_resources()de las qt6_add_resources()funciones y Qt buscará en todos los archivos de recursos registrados.

Es importante tener en cuenta que cuando utilice varios .qrcarchivos , asegúrese de que los nombres y las rutas de los archivos no coincidan para evitar confusiones y posibles errores.

Archivos de recursos de referencia usando URL sin prefijo

De acuerdo con la documentación oficial de Qt, a partir de Qt 6.2, puede omitir el prefijo en el código QML, pero en el código C++, aún debe usar qrc:el prefijo para hacer referencia a los archivos de recursos. Esto se debe a que QML y C++ son dos lenguajes diferentes con diferentes reglas de nomenclatura y estructuras sintácticas.

En QML, puede usar importla declaración para hacer referencia a un archivo QML sin usar un prefijo. Sin embargo, en C++, se debe hacer referencia a los archivos de recursos con qrc:el prefijo para usar en QML.

Por lo tanto, si desea usar código C++ en QML, debe usar qrc:el prefijo . Puede omitir el prefijo si solo desea usar código C++ en QML.

Supongo que te gusta

Origin blog.csdn.net/qq_21438461/article/details/130464065
Recomendado
Clasificación