无法在 Qt 中执行 ftp ConnectToHost
Posted
技术标签:
【中文标题】无法在 Qt 中执行 ftp ConnectToHost【英文标题】:Not being able to execute ftp ConnectToHost in Qt 【发布时间】:2013-12-19 08:00:20 【问题描述】:#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");
任何建议都会有所帮助。谢谢!
【问题讨论】:
【参考方案1】:当您的 Test
类构造函数超出范围时,您的 ftp
对象将被销毁。 QFtp::connectToHost
函数不会阻塞并立即返回。 QFtp::login
也是如此。
要解决这个问题,您可以使用new
分配您的QFtp
对象:
QFtp *ftp = new QFtp(this);
【讨论】:
@user3110438 请注意,如果您想在您的Test
类的其他函数中使用ftp
对象,您应该像Laszlo Papp 所说的那样使其成为您的Test
类的成员变量。
【参考方案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对象。
【讨论】:
@user3110438:乐于提供帮助。 :) @Laslzo 上面的代码工作正常,但存在一个问题,即 ftp 仅在 a.exec(); 之后才连接到主机;在主代码中执行。现在的问题是我首先生成了一个应用程序窗口,该窗口在应用程序执行后显示(a.exec),并且从生成的主窗口中我必须执行 FTP 操作但它在那里失败了,我应用了你的建议但仍然失败我的窗口.......我的问题可能很傻......在 Qt 中天真我很抱歉......任何建议都可能会有所帮助以上是关于无法在 Qt 中执行 ftp ConnectToHost的主要内容,如果未能解决你的问题,请参考以下文章
qt udp/tcp 绑定发送源端口(Specify source UDP port when writing datagram)
qt udp/tcp 绑定发送源端口(Specify source UDP port when writing datagram)