Problèmes avec QNetworkRequest : undefined reference to `QNetworkRequest::QNetworkRequest()
-
Salut !
Je cherche à me connecter à un serveur avec mon programme Qt et mon code sort :/.../main/mainwindow.cpp:72: erreur : undefined reference to `QNetworkRequest::QNetworkRequest(QUrl const&)'
Or, j'utilise CMake et sur internet, on ne trouve que des réponses pour les fichiers .pro.
Merci d'avance pour votre aide !!!PS : voici mon code
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QWidget> #include <QSpacerItem> #include <QLabel> #include <QVBoxLayout> #include <QLineEdit> #include <QPushButton> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); public slots: void SetNetworksParameters(); void Login(); private: Ui::MainWindow *ui; QWidget* MainLoginWindowWidget; QVBoxLayout* MainLoginWindowLayout; QSpacerItem* MainLoginWindowTopSpacer; QSpacerItem* MainLoginWindowAfterTitleSpacer; QSpacerItem* MainLoginWindowAfterLineEditNameSpacer; QSpacerItem* MainLoginWindowAfterLineEditPassCodeSpacer; QSpacerItem* MainLoginWindowButtomSpacer; QLabel* MainLoginWindowTitleLabel; QLineEdit* MainLoginWindowLineEditName; QLineEdit* MainLoginWindowLineEditPassCode; QPushButton* MainLoginWindowButtonLogin; }; #endif // MAINWINDOW_H
et
//mainwindow.cpp #include "mainwindow.h" #include "./ui_mainwindow.h" #include <QTextStream> #include <QFile> #include <QMessageBox> #include <QtNetwork/QtNetwork> #include <QtNetwork/QNetworkReply> #include <QtNetwork/QNetworkAccessManager> #include <QtNetwork/QNetworkRequest> #include <QUrl> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); MainLoginWindowWidget = new QWidget(this); MainLoginWindowLayout = new QVBoxLayout(MainLoginWindowWidget); MainLoginWindowTopSpacer = new QSpacerItem(160, 100); MainLoginWindowAfterTitleSpacer = new QSpacerItem(160, 50); MainLoginWindowAfterLineEditNameSpacer = new QSpacerItem(160, 20); MainLoginWindowAfterLineEditPassCodeSpacer = new QSpacerItem(160, 20); MainLoginWindowButtomSpacer = new QSpacerItem(160, 40); MainLoginWindowTitleLabel = new QLabel("Connecte toi :"); MainLoginWindowLineEditName = new QLineEdit(); MainLoginWindowLineEditPassCode = new QLineEdit(); MainLoginWindowButtonLogin = new QPushButton("Se connecter"); MainLoginWindowLayout->setAlignment(Qt::AlignTop); QFile MainLoginWindowStyleSheetFile(":/styles/mainloginwindow.qss"); MainLoginWindowStyleSheetFile.open(QIODevice::ReadOnly); QTextStream MainLoginWindowStyleSheetTextStream(&MainLoginWindowStyleSheetFile); QString MainLoginWindowStyleSheetString = MainLoginWindowStyleSheetTextStream.readAll(); MainLoginWindowStyleSheetFile.close(); MainLoginWindowWidget->setStyleSheet(MainLoginWindowStyleSheetString); MainLoginWindowTitleLabel->setStyleSheet(MainLoginWindowStyleSheetString); MainLoginWindowLineEditName->setStyleSheet(MainLoginWindowStyleSheetString); MainLoginWindowLineEditPassCode->setStyleSheet(MainLoginWindowStyleSheetString); MainLoginWindowButtonLogin->setStyleSheet(MainLoginWindowStyleSheetString); MainLoginWindowLayout->addSpacerItem(MainLoginWindowTopSpacer); MainLoginWindowLayout->addWidget(MainLoginWindowTitleLabel, 0, Qt::AlignHCenter); MainLoginWindowLayout->addSpacerItem(MainLoginWindowAfterTitleSpacer); MainLoginWindowLayout->addWidget(MainLoginWindowLineEditName, 0, Qt::AlignHCenter); MainLoginWindowLayout->addSpacerItem(MainLoginWindowAfterLineEditNameSpacer); MainLoginWindowLayout->addWidget(MainLoginWindowLineEditPassCode, 0, Qt::AlignHCenter); MainLoginWindowLayout->addSpacerItem(MainLoginWindowAfterLineEditPassCodeSpacer); MainLoginWindowLayout->addWidget(MainLoginWindowButtonLogin, 0, Qt::AlignHCenter); MainLoginWindowLayout->addSpacerItem(MainLoginWindowButtomSpacer); connect(MainLoginWindowButtonLogin, SIGNAL(clicked()), this, SLOT(Login())); this->setCentralWidget(MainLoginWindowWidget); } MainWindow::~MainWindow() { delete ui; } void MainWindow::SetNetworksParameters() { MainLoginWindowButtonLogin->setEnabled(false); QFile UrlFile(":/texts/url.txt"); UrlFile.open(QIODevice::ReadOnly); QTextStream UrlTextStream(&UrlFile); UrlFile.close(); QString UrlString = UrlTextStream.readAll(); const QUrl MainServerUrl = QUrl(UrlString); QNetworkRequest MainServerQuery(MainServerUrl); QNetworkAccessManager *m = new QNetworkAccessManager(this); QNetworkReply *r = m->get(MainServerQuery); connect(r, SIGNAL(finished()), this, SLOT(Login())); } void MainWindow::Login() { QMessageBox::information(this, "OK", "OK !"); }
-
target_link_libraries(main PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Network)
Ou alors sur une ligne séparée:
target_link_libraries(main PRIVATE Qt${QT_VERSION_MAJOR}::Network)
Il y a les exemples pour cmake et qmake au sommet de la documentation des classes comme pour QNetworkRequest.
-
Bonsoir,
Que contient le fichier
CMakeLists.txt
?
Il faut s'assurer que le module network est dans la liste des dépendances de l'application. -
Non, il n'y est pas, j'utilise le code pré-fait et y ajoute juste les fichiers dont j'ai besoin.
cmake_minimum_required(VERSION 3.5) project(main VERSION 0.1 LANGUAGES CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Network) set(PROJECT_SOURCES main.cpp mainwindow.cpp mainwindow.h mainwindow.ui files.qrc ) if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) qt_add_executable(main MANUAL_FINALIZATION ${PROJECT_SOURCES} ) # Define target properties for Android with Qt 6 as: # set_property(TARGET main APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR # ${CMAKE_CURRENT_SOURCE_DIR}/android) # For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation else() if(ANDROID) add_library(main SHARED ${PROJECT_SOURCES} ) # Define properties for Android with Qt 5 after find_package() calls as: # set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android") else() add_executable(main ${PROJECT_SOURCES} ) endif() endif() target_link_libraries(main PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) set_target_properties(main PROPERTIES MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} MACOSX_BUNDLE TRUE WIN32_EXECUTABLE TRUE ) install(TARGETS main BUNDLE DESTINATION . LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) if(QT_VERSION_MAJOR EQUAL 6) qt_finalize_executable(main) endif()
Comment on l'ajoute ?
-
target_link_libraries(main PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Network)
Ou alors sur une ligne séparée:
target_link_libraries(main PRIVATE Qt${QT_VERSION_MAJOR}::Network)
Il y a les exemples pour cmake et qmake au sommet de la documentation des classes comme pour QNetworkRequest.
-
A, oui oups...
Merci !