#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中工作得很好,但每当从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");
}
任何建议都会有所帮助。谢谢!
答案 0 :(得分:3)
当您的Test
类构造函数超出范围时,您的ftp
对象将被销毁。 QFtp::connectToHost
函数不会阻塞并立即返回。同样适用于QFtp::login
。
要解决此问题,您可以使用QFtp
分配new
对象:
QFtp *ftp = new QFtp(this);
答案 1 :(得分: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时,此版本很好。
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对象。