Partage
  • Partager sur Facebook
  • Partager sur Twitter

Qt cmake subdirectory

ne fonctionne plus avec l'interface graphique

Sujet résolu
    16 janvier 2021 à 21:28:32

    Bonjour,

    Je programme actuellement avec Qt5 et l'éditeur CLION.

    J'ai créer un programme simple en console avec QCoreApplication, une fois celui-ci fonctionnel j'ai voulu lui ajouter une interface graphique afin d'afficher les résultats simplement, j'ai donc créer avec QT Designer une simple fenêtre mais je n'arrive pas a l'afficher.

    Pour vous présenter le problème j'ai réussi a le reproduire en recréant un nouveau projet comme suit tout fonctionne bien, ça compile et quand je lance j'ai bien ma fenêtre et un bouton :

    Projet

    • main
      • main.cpp
      • widget.cpp
      • widget.hpp
      • widget.ui
    • CMakeLists.txt

    main/main.cpp :

    #include <QApplication>
    #include "widget.hpp"
    
    int main(int argc, char *argv[]) {
        QApplication a(argc, argv);
    
        Widget w;
        w.show();
    
        return QApplication::exec();
    }
    

    main/widget.cpp :

    #include "widget.hpp"
    #include "./ui_widget.h"
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget)
    {
        ui->setupUi(this);
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    

    main/widget.hpp :

    #ifndef WIDGET_HPP
    #define WIDGET_HPP
    
    #include <QWidget>
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class Widget; }
    QT_END_NAMESPACE
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        Widget(QWidget *parent = nullptr);
        ~Widget();
    
    private:
        Ui::Widget *ui;
    };
    #endif // WIDGET_HPP
    


    main/widget.ui

    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>Widget</class>
     <widget class="QWidget" name="Widget">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>800</width>
        <height>600</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>Widget</string>
      </property>
      <layout class="QVBoxLayout" name="verticalLayout">
       <item>
        <widget class="QPushButton" name="pushButton">
         <property name="text">
          <string>PushButton</string>
         </property>
        </widget>
       </item>
      </layout>
     </widget>
     <resources/>
     <connections/>
    </ui>
    


    CMakeLists.txt :

    cmake_minimum_required(VERSION 3.17)
    project(untitled)
    
    set(CMAKE_CXX_STANDARD 14)
    set(CMAKE_PREFIX_PATH "C:/Qt/5.15.2/mingw81_64/lib/cmake")
    
    
    set(CMAKE_AUTOMOC ON)
    set(CMAKE_AUTORCC ON)
    set(CMAKE_AUTOUIC ON)
    
    set(QT_VERSION 5)
    set(REQUIRED_LIBS Core Gui Widgets)
    
    if (NOT CMAKE_PREFIX_PATH)
        message(WARNING "CMAKE_PREFIX_PATH is not defined, you may need to set it "
                "(-DCMAKE_PREFIX_PATH=\"path/to/Qt/lib/cmake\" or -DCMAKE_PREFIX_PATH=/usr/include/{host}/qt{version}/ on Ubuntu)")
    endif ()
    
    find_package(Qt${QT_VERSION} COMPONENTS ${REQUIRED_LIBS} REQUIRED)
    
    
    add_executable(${PROJECT_NAME}
            main/main.cpp
            main/widget.cpp
            main/widget.ui
            )
    target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
    if (WIN32)
        set(DEBUG_SUFFIX)
        if (CMAKE_BUILD_TYPE MATCHES "Debug")
            set(DEBUG_SUFFIX "d")
        endif ()
        set(QT_INSTALL_PATH "${CMAKE_PREFIX_PATH}")
        if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
            set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
            if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
                set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
            endif ()
        endif ()
        if (EXISTS "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll")
            add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                    COMMAND ${CMAKE_COMMAND} -E make_directory
                    "$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
            add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                    COMMAND ${CMAKE_COMMAND} -E copy
                    "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll"
                    "$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
        endif ()
        foreach (QT_LIB ${REQUIRED_LIBS})
            add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                    COMMAND ${CMAKE_COMMAND} -E copy
                    "${QT_INSTALL_PATH}/bin/Qt${QT_VERSION}${QT_LIB}${DEBUG_SUFFIX}.dll"
                    "$<TARGET_FILE_DIR:${PROJECT_NAME}>")
        endforeach (QT_LIB)
    endif ()
    
    

    Cependant si j'éssaye de créer une structure avec des sous-repertoires cmake :

    Projet

    • main
      • CMakeLists.txt
      • main.cpp
      • widget.cpp
      • widget.hpp
      • widget.ui
    • CMakeLists.txt

    CMakeLists.txt :

    cmake_minimum_required(VERSION 3.17)
    project(untitled)
    
    set(CMAKE_CXX_STANDARD 14)
    set(CMAKE_PREFIX_PATH "C:/Qt/5.15.2/mingw81_64/lib/cmake")
    
    
    set(CMAKE_AUTOMOC ON)
    set(CMAKE_AUTORCC ON)
    set(CMAKE_AUTOUIC ON)
    
    set(QT_VERSION 5)
    set(REQUIRED_LIBS Core Gui Widgets)
    
    if (NOT CMAKE_PREFIX_PATH)
        message(WARNING "CMAKE_PREFIX_PATH is not defined, you may need to set it "
                "(-DCMAKE_PREFIX_PATH=\"path/to/Qt/lib/cmake\" or -DCMAKE_PREFIX_PATH=/usr/include/{host}/qt{version}/ on Ubuntu)")
    endif ()
    
    find_package(Qt${QT_VERSION} COMPONENTS ${REQUIRED_LIBS} REQUIRED)
    
    
    add_subdirectory(main)


    main/CMakeLists.txt :

    add_executable(${PROJECT_NAME}
            main.cpp
            widget.cpp
            widget.ui
            )
    target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets)
    if (WIN32)
        set(DEBUG_SUFFIX)
        if (CMAKE_BUILD_TYPE MATCHES "Debug")
            set(DEBUG_SUFFIX "d")
        endif ()
        set(QT_INSTALL_PATH "${CMAKE_PREFIX_PATH}")
        if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
            set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
            if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
                set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
            endif ()
        endif ()
        if (EXISTS "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll")
            add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                    COMMAND ${CMAKE_COMMAND} -E make_directory
                    "$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
            add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                    COMMAND ${CMAKE_COMMAND} -E copy
                    "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll"
                    "$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
        endif ()
        foreach (QT_LIB ${REQUIRED_LIBS})
            add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                    COMMAND ${CMAKE_COMMAND} -E copy
                    "${QT_INSTALL_PATH}/bin/Qt${QT_VERSION}${QT_LIB}${DEBUG_SUFFIX}.dll"
                    "$<TARGET_FILE_DIR:${PROJECT_NAME}>")
        endforeach (QT_LIB)
    endif ()
    
    


    Ce code génère les fichiers cmake, il compile sans erreur cependant quand je lance l'exécutable le programme ce termine directement sans message d'erreur ni de fenêtre avec le QPushbutton.

    Mon programme cible genère des plugins Qt et j'ai donc décomposer mon code avec un dossier lib et plusieurs sous-dossier, la compilation ce passe bien et genère mes dll correctement.

    Je ne peut donc pas tout mettre dans le même dossier.

    Je n'ai pas réussi a comprendre pourquoi ce comportement, il me manque quelque chose ?

    Cordialement,

    Timiti29

    Edit : résolu, il manquait l'inclusion Gui, je pensais que seul Widgets était requit

    -
    Edité par timiti29 16 janvier 2021 à 21:39:12

    • Partager sur Facebook
    • Partager sur Twitter
    DUT Réseau & Télécommunication et Licence Professionnelle Réseau Sans-Fil et Sécurité

    Qt cmake subdirectory

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    • Editeur
    • Markdown