#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");
}
任何建议都会有所帮助。谢谢!
当Test
类构造函数超出范围时,ftp
对象将被销毁。 QFtp::connectToHost
函数不会阻塞并立即返回。QFtp::login
也是如此.
要解决此问题,您可以使用new
分配QFtp
对象:
QFtp *ftp = new QFtp(this);
我建议使用类成员,因为它是异步操作。你在堆栈上有一个对象,当函数以及对象的生命周期结束时,该对象将被展开。
您有三种选择来处理此问题:
类成员
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 时,此版本很好。
Q父子关系
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对象。