2
#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)在 main 中运行良好,但每当从 class 调用时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");
}

任何的意见都将会有帮助。谢谢!

4

2 回答 2

3

当您的Test类构造函数超出范围时,您的ftp对象将被销毁。QFtp::connectToHost函数不会阻塞并立即返回。也一样QFtp::login

要解决此问题,您可以QFtp使用以下方法分配对象new

QFtp *ftp = new QFtp(this);
于 2013-12-19T08:17:18.707 回答
0

我建议使用类成员,因为它是异步操作。您在堆栈上有一个对象,该对象将在函数结束时展开,并且就此而言,对象的生命周期结束。

您有三种选择来处理此问题:

班级成员

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 对象。

于 2013-12-19T08:32:15.287 回答