Не в состоянии выполнить ftp ConnectToHost в Qt

#include <qftp.h>
#include <qapplication.h>
#include "test.h"
#include "ui_test.h"
#include <qfile.h>

int main()
{
    QApplication a(argc, argv);
    Test w;
    ftp.connectToHost("192.168.26.129", 21);
    w.show();
    return a.exec();
}

Я новичок в Qt, ftp.connectToHost("192.168.26.129", 21) хорошо работает из основного, но всякий раз, когда вызывается из класса Test, он терпит неудачу (с тем же включением заголовка), как показано ниже.

Test::Test(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Test)
{   
    ui->setupUi(this);
    QFtp ftp;

    int x = ftp.connectToHost("192.168.26.129", 21);
    ftp.login("User1", "passwd");
}

Любые предложения будут полезны. Спасибо!

2 ответа

Решение

Я бы предложил использовать член класса, так как это асинхронная операция. У вас есть объект в стеке, который будет размотан, когда закончится функция, и в этом отношении жизненный цикл объекта.

У вас есть три варианта, чтобы справиться с этим:

Член класса

Test::Test(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Test)
{   
    ui->setupUi(this);

    int x = m_ftp.connectToHost("192.168.26.129", 21);
    m_ftp.login("User1", "passwd");
}

Эта версия полезна, когда вам нужен объект QFtp и в другом методе.

Умный указатель

Test::Test(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Test)
{   
    ui->setupUi(this);
    QPointer m_ftp = new QFtp());

    int x = ftp->connectToHost("192.168.26.129", 21);
    ftp->login("User1", "passwd");
}

Эта версия хороша, когда вам нужен только объект QFtp в этом методе, а класс Test не является QObject.

QObject родительско-дочерние отношения

Test::Test(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Test)
{   
    ui->setupUi(this);
    QFtp ftp = new Ftp(this);    

    int x = ftp->connectToHost("192.168.26.129", 21);
    ftp->login("User1", "passwd");
}

Это не будет работать, если класс "Test" станет не-QObject, но он достаточно хорош, когда Test наследует это, и вам нужен только объект QFtp в этом методе.

Когда ваш Test конструктор класса выходит из области видимости, ваш ftp объект уничтожается. QFtp::connectToHost Функция не блокирует и возвращает сразу. То же самое касается QFtp::login,

Для решения этой проблемы вы можете выделить свой QFtp использование объекта new:

QFtp *ftp = new QFtp(this);
Другие вопросы по тегам