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

0

非同期操作であるため、クラス メンバーを使用することをお勧めします。関数が終了するとアンワインドされるスタック上にオブジェクトがあり、さらに言えばオブジェクトのライフサイクルが終了します。

これを処理するには、次の 3 つの方法があります。

クラスメンバー

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 に答える