Mit Qt erstellte Dll in nicht Qt Projekt verwenden?

Alles rund um die Programmierung mit Qt
Antworten
mdmr
Beiträge: 18
Registriert: 4. April 2010 15:01

Mit Qt erstellte Dll in nicht Qt Projekt verwenden?

Beitrag von mdmr »

Hallo liebe Qt´ler,

eine Frage zum System.

Vorweg ich habe seit Qt4.8 nichts mehr mit Qt gemacht^^.

Ich habe ein Witty Projekt und wollte mit Qt eine dll zum Ftp File Upload erstellen.
Die Qt Abhängigkeiten habe ich mit einem pimpl Idiom versteckt. Also private Klasse mit Vorwärtsdeklaration, den Qt Teil in der cpp Datei. Nach Außen der DLL wird Qt unabhängig in reinem C++ exportiert.

Bei Versuchen die Dll aus einer nicht Qt Anwendung zu nutzen wird mit folgender Fehlermeldung quittiert:
QEventLoop: Cannot be used without QApplication

Liegt der Fehler in meinem Code oder sind das Probleme mit dem Moc bzw. kann eine mit Qt erstellte Dll nicht in einer nicht Qt Anwendung verwendet werden?

Mein Code der Dll:

Code: Alles auswählen

#define FTPUP_H

#ifdef FTP_LIB
# define FTP_EXPORT __declspec(dllexport)
#else
# define FTP_EXPORT __declspec(dllimport)
#endif

class FTP_EXPORT FtpUp
{
public:
    
     FtpUp(const char * FileName, const char * Host, const char * Path,  const char * User, const char * Pw);
    ~FtpUp();
    bool uploadStart(void);
    const char * getErrorText(void);
    bool hasNoError(void);
    bool uploadDone(void);
    long long getBytesSend(void);
    long long getBytesTotal(void);
    

private:
    FtpUp();
    
    class pimpl;
     pimpl * data;


};

#endif // FTPUP_H 

Code: Alles auswählen

#include "stdafx.h"
#include "ftpup.h"

#include <QApplication>
#include <QtCore>
#include <QtNetwork>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QFile>
#include <string>
#include <QUrl>
#include <QString>

class FtpUp::pimpl : public QObject
{
    Q_OBJECT
public:
    pimpl(){}
    pimpl(const char * FileName, const char * Host, const char * Path,  const char * User, const char * Pw);
    ~pimpl();
    bool PuploadStart(void);
    std::string PgetErrorText(void);
    bool PhasNoError(void);
    bool PuploadDone(void);
    long long PgetBytesSend(void);
    long long PgetBytesTotal(void);
    void PSlotUploadDone();
    void PSlotUploadProgressCount(qint64 bytesSent, qint64 bytesTotal);

private:
    QString m_srcName;
    QString m_user;
    QString m_pw;
    QFile * m_file;
    QUrl m_url;
    QNetworkAccessManager m_network;
    QNetworkReply * m_reply;
    qint64 m_bytesSend;
    qint64 m_bytesTotal;
    bool m_done;
    QString m_errorText;
    bool m_hasNoError;

};

FtpUp::pimpl::pimpl(const char * FileName, const char * Host, const char * Path,  const char * User, const char * Pw)
: m_srcName(FileName),  m_user(User), m_pw(Pw) , QObject(0)
{
    m_url.setHost(Host);
    m_url.setPath(Path);
    m_url.setPassword(m_pw);
    m_url.setUserName(m_user);
    m_url.setScheme("ftp");
    m_url.setPort(21);
    m_done = false;
    m_hasNoError = true;
    m_errorText ="";
}

bool FtpUp::pimpl::PuploadStart(void)
{
    m_file = new QFile(m_srcName);
    if(m_file->open(QIODevice::ReadOnly)){
         m_done = false;
        m_reply = m_network.put(QNetworkRequest(m_url), m_file);
        connect(m_reply, &QNetworkReply::finished,this,  &FtpUp::pimpl::PSlotUploadDone);
        connect(m_reply, &QNetworkReply::uploadProgress, this, &FtpUp::pimpl::PSlotUploadProgressCount);
        m_hasNoError = true;
       
        return true;
    }
    else{
        m_hasNoError = false;
        m_errorText = "File Error";
        return false;
    }
}

void FtpUp::pimpl::PSlotUploadDone()
{
    if( m_reply->error() == QNetworkReply::NoError) m_hasNoError = true;
    else{
        m_hasNoError = false;
        m_errorText = m_reply->errorString();
    }
    m_done = true;
    m_file->deleteLater();
    m_reply->deleteLater();
}


void FtpUp::pimpl::PSlotUploadProgressCount(qint64 bytesSent, qint64 bytesTotal)
{
    m_bytesSend = bytesSent;
    m_bytesTotal = bytesTotal;
}


bool FtpUp::pimpl::PuploadDone(void)
{
    return m_done;
}


long long FtpUp::pimpl::PgetBytesSend(void)
{
    return m_bytesSend;
}


long long FtpUp::pimpl::PgetBytesTotal(void)
{
    return m_bytesTotal;
}


std::string FtpUp::pimpl::PgetErrorText(void)
{
    return m_errorText.toStdString();
}

bool FtpUp::pimpl::PhasNoError(void)
{
    return m_hasNoError;
}

FtpUp::pimpl::~pimpl()
{
}

//////////////////// 
//////////////////// End Pimpl
////////////////////




FtpUp::FtpUp(const char * FileName, const char * Host, const char * Path,  const char * User, const char * Pw)
    :data ( new pimpl(FileName, Host, Path, User, Pw))
   
{
    
}

FtpUp::~FtpUp()
{
    delete data;
}

bool FtpUp::uploadStart(void)
{
    return data->PuploadStart();
}

bool FtpUp::uploadDone(void)
{
    return data->PuploadDone();
}


long long FtpUp::getBytesSend(void)
{
    return data->PgetBytesSend();
}


long long FtpUp::getBytesTotal(void)
{
    return data->PgetBytesTotal();
}


const char * FtpUp::getErrorText(void)
{
    return data->PgetErrorText().c_str();
}

bool FtpUp::hasNoError(void)
{
    return data->PhasNoError();
}
#include "ftpup.moc"
Zum Testen ohne Framework einer Art:

Code: Alles auswählen

#include "stdafx.h"
#include "../FtpUp/ftpup.h"
#include <iostream>


int _tmain(int argc, _TCHAR* argv[])
{
    FtpUp data("G:/Bilder/Beispiel.jpg", "192.168.1.11", "img/l/",  "User", "Pw" );
    std::cout << "Start = " << data.uploadStart() << std::endl;
    while(! data.uploadDone()){
        std::cout << "Byte Total = " << data.getBytesTotal() << "Byte Current" << data.getBytesSend() << std::endl;

    }
    std::cout << "Has Error = " << data.hasNoError() << std::endl;
    std::cout << "Error Text = " << data.getErrorText() << std::endl;
    std::cin.get();
	return 0;
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Mit Qt erstellte Dll in nicht Qt Projekt verwenden?

Beitrag von Christian81 »

Da Du eine Q(Core)Application oder besser eine EventLoop benötigst wird das nichts werden. Das Hauptprogramm benötigt auch zwingend eine Q(Core)Application Instanz
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten