вначале жалко для моего английского: -D
У меня QT 5.6 и QT Creator IDE.
Если я скомпилирую свою программу в режиме отладки, не проблема.
Если я скомпилирую в режиме освобождения, я не получаю никакого сигнала от QFTP
FTPManager::FTPManager(QObject *parent)
{
m_pFTP = new QFtp(parent->parent());
connect(m_pFTP, SIGNAL(commandFinished(int,bool)),this, SLOT(ftpCommandFinished(int,bool)));
connect(m_pFTP, SIGNAL(stateChanged(int)),this, SLOT(ftpStateChanged(int)));
connect(m_pFTP, SIGNAL(dataTransferProgress(qint64,qint64)),this, SLOT(updateDataTransferProgress(qint64,qint64)));
connect(m_pFTP, SIGNAL(readyRead()),this,SLOT(readData()));
connect(m_pFTP, SIGNAL(listInfo(QUrlInfo)), this, SLOT(GetList(QUrlInfo)));
connect(m_pFTP, SIGNAL(commandStarted(int)),this,SLOT(ftpCommandStarted(int)));
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_pRezepturVerwaltung = new RezepturVerwaltung(ui);
m_pFTPManager = new FTPManager(this);
connect(m_pFTPManager, SIGNAL(DownloadFinish()), m_pRezepturVerwaltung, SLOT(AktualisiereShowProgparOrdnerstruktur()));
connect(m_pFTPManager, SIGNAL(OwndataTransferProgress(qint64,qint64)),m_pRezepturVerwaltung, SLOT(updateDataTransferProgress(qint64,qint64)));
connect(m_pRezepturVerwaltung, SIGNAL(SignalUpload(QString, QString, QString, QString)),
m_pFTPManager, SLOT(Upload(QString, QString, QString, QString)));
connect(m_pRezepturVerwaltung, SIGNAL(SignalDownload(QString, QString, QString, QString)),
m_pFTPManager, SLOT(Download(QString, QString, QString, QString)));
}
У меня есть класс Q_Object в классе:
class FTPManager : public QObject
{
Q_OBJECT
public:
explicit FTPManager(QObject *parent = 0);
~FTPManager();
QFtp * m_pFTP;
};
Я попытался очистить, а затем qmake.
Я удаляю файл, записывающий дыры.
РЕДАКТИРОВАТЬ:
i call void FTPManager :: downloadMehrereDateien (), если я хочу загрузить любой файл.
void FTPManager::downloadMehrereDateien()
{
//Uberprufen ob es noch Dateien zu abbarbeiten gibt
if (!m_strukDownloadFile.xAktive)
{
if(m_lDownloadqueue.count() > 0)
{
m_strukDownloadFile = m_lDownloadqueue.takeAt(0);
m_strukDownloadFile.xAktive = true;
}else
{
m_pFTP->close();
return;
}
}
if(!m_struktStatus.Connected)
{
connectToFtp(m_strukDownloadFile.sIP);
m_pFTP->error();
}else
{
if(!m_struktStatus.LoggedIn)
{
LoginToFtp();
}else
{
m_pFTP->cd("StorageCard");
m_pFTP->cd("DATA");
int fileErweiterung = 1;
QString sDateiUndSpeicherpfad = "", sDownlodFileName = "";
sDateiUndSpeicherpfad = m_strukDownloadFile.sSpeicherPfad + m_strukDownloadFile.sFileName + m_strukDownloadFile.sDateiendung;
sDownlodFileName = m_strukDownloadFile.sFileName + m_strukDownloadFile.sDateiendung;
actionFile = new QFile(sDateiUndSpeicherpfad);
while( actionFile->exists() )
{
sDateiUndSpeicherpfad =m_strukDownloadFile.sSpeicherPfad + m_strukDownloadFile.sFileName + QString::number(fileErweiterung) + ".TAB";
actionFile->setFileName(sDateiUndSpeicherpfad);
fileErweiterung++;
};
if (!actionFile->open(QIODevice::WriteOnly))
{
qDebug() << "Datei kann nicht geoffnet werden";
delete actionFile;
m_strukDownloadFile.xAktive = false; //ToDo: Spater mehrere versuche dann erst false
downloadMehrereDateien();
}else
{
m_sAktDownloadDateiName = m_strukDownloadFile.sFileName + m_strukDownloadFile.sDateiendung;
m_pFTP->list();
m_pFTP->get(sDownlodFileName, actionFile);
m_strukDownloadFile.xAktive = false;
downloadMehrereDateien();
}
}
}
}
void FTPManager::connectToFtp(QString sServerIp)
{
m_pFTP->connectToHost(sServerIp, 21);
qDebug() << "Connecting to FTP server " << sServerIp;
}
Вывод приложения говорит: «Подключение к FTP-серверу» 172.18.16.121 «"
Edit2:
я создал новый небольшой проект с той же проблемой: https://dl.dropboxusercontent.com/u/13704266/qftptest.rar
вначале жалко для моего английского: -D
У меня QT 5.6 и QT Creator IDE.
Если я скомпилирую свою программу в режиме отладки, не проблема.
Если я скомпилирую в режиме освобождения, я не получаю никакого сигнала от QFTP
FTPManager::FTPManager(QObject *parent)
{
m_pFTP = new QFtp(parent->parent());
connect(m_pFTP, SIGNAL(commandFinished(int,bool)),this, SLOT(ftpCommandFinished(int,bool)));
connect(m_pFTP, SIGNAL(stateChanged(int)),this, SLOT(ftpStateChanged(int)));
connect(m_pFTP, SIGNAL(dataTransferProgress(qint64,qint64)),this, SLOT(updateDataTransferProgress(qint64,qint64)));
connect(m_pFTP, SIGNAL(readyRead()),this,SLOT(readData()));
connect(m_pFTP, SIGNAL(listInfo(QUrlInfo)), this, SLOT(GetList(QUrlInfo)));
connect(m_pFTP, SIGNAL(commandStarted(int)),this,SLOT(ftpCommandStarted(int)));
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_pRezepturVerwaltung = new RezepturVerwaltung(ui);
m_pFTPManager = new FTPManager(this);
connect(m_pFTPManager, SIGNAL(DownloadFinish()), m_pRezepturVerwaltung, SLOT(AktualisiereShowProgparOrdnerstruktur()));
connect(m_pFTPManager, SIGNAL(OwndataTransferProgress(qint64,qint64)),m_pRezepturVerwaltung, SLOT(updateDataTransferProgress(qint64,qint64)));
connect(m_pRezepturVerwaltung, SIGNAL(SignalUpload(QString, QString, QString, QString)),
m_pFTPManager, SLOT(Upload(QString, QString, QString, QString)));
connect(m_pRezepturVerwaltung, SIGNAL(SignalDownload(QString, QString, QString, QString)),
m_pFTPManager, SLOT(Download(QString, QString, QString, QString)));
}
У меня есть класс Q_Object в классе:
class FTPManager : public QObject
{
Q_OBJECT
public:
explicit FTPManager(QObject *parent = 0);
~FTPManager();
QFtp * m_pFTP;
};
Я попытался очистить, а затем qmake.
Я удаляю файл, записывающий дыры.
РЕДАКТИРОВАТЬ:
i call void FTPManager :: downloadMehrereDateien (), если я хочу загрузить любой файл.
void FTPManager::downloadMehrereDateien()
{
//Uberprufen ob es noch Dateien zu abbarbeiten gibt
if (!m_strukDownloadFile.xAktive)
{
if(m_lDownloadqueue.count() > 0)
{
m_strukDownloadFile = m_lDownloadqueue.takeAt(0);
m_strukDownloadFile.xAktive = true;
}else
{
m_pFTP->close();
return;
}
}
if(!m_struktStatus.Connected)
{
connectToFtp(m_strukDownloadFile.sIP);
m_pFTP->error();
}else
{
if(!m_struktStatus.LoggedIn)
{
LoginToFtp();
}else
{
m_pFTP->cd("StorageCard");
m_pFTP->cd("DATA");
int fileErweiterung = 1;
QString sDateiUndSpeicherpfad = "", sDownlodFileName = "";
sDateiUndSpeicherpfad = m_strukDownloadFile.sSpeicherPfad + m_strukDownloadFile.sFileName + m_strukDownloadFile.sDateiendung;
sDownlodFileName = m_strukDownloadFile.sFileName + m_strukDownloadFile.sDateiendung;
actionFile = new QFile(sDateiUndSpeicherpfad);
while( actionFile->exists() )
{
sDateiUndSpeicherpfad =m_strukDownloadFile.sSpeicherPfad + m_strukDownloadFile.sFileName + QString::number(fileErweiterung) + ".TAB";
actionFile->setFileName(sDateiUndSpeicherpfad);
fileErweiterung++;
};
if (!actionFile->open(QIODevice::WriteOnly))
{
qDebug() << "Datei kann nicht geoffnet werden";
delete actionFile;
m_strukDownloadFile.xAktive = false; //ToDo: Spater mehrere versuche dann erst false
downloadMehrereDateien();
}else
{
m_sAktDownloadDateiName = m_strukDownloadFile.sFileName + m_strukDownloadFile.sDateiendung;
m_pFTP->list();
m_pFTP->get(sDownlodFileName, actionFile);
m_strukDownloadFile.xAktive = false;
downloadMehrereDateien();
}
}
}
}
void FTPManager::connectToFtp(QString sServerIp)
{
m_pFTP->connectToHost(sServerIp, 21);
qDebug() << "Connecting to FTP server " << sServerIp;
}
Вывод приложения говорит: «Подключение к FTP-серверу» 172.18.16.121 «"
Edit2:
я создал новый небольшой проект с той же проблемой: https://dl.dropboxusercontent.com/u/13704266/qftptest.rar
00C ++, Qt, сигналы, выпуск, QFtp,