初级bug开发工程师 2024-03-25 10:47 采纳率: 0%
浏览 9

qftp的 put函数第n次提交,会收到n个commandfinished信号正常吗?

使用qftp的put函数上传文件时,调用一次收到一个x命令执行完成ommandfinished信号,第二次调用则收到两个,第n次调用收到n个,这样正常吗,而且收到的那个信号的命令id都是第N次提交的命令id

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-03-25 10:47
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题分析: 使用qftp的put函数上传文件时,每次调用都会收到命令执行完成的信号。但是发现第二次调用时会收到两个信号,第n次调用会收到n个信号。这样的现象是否正常?为什么会出现这种情况?信号中的命令id又是如何生成的? 解答:
    1. 是否正常? 这种现象是正常的,因为QFtp组件在内部为每个操作创建了一个命令,当你调用一个函数时,就相当于发送了一个命令给FTP服务器。当命令执行完成后,QFtp就会发送“commandFinished”信号,告诉你这个命令执行完毕。所以,每一个QFtp命令都会产生一次“commandFinished”信号。
    2. 为什么会出现这种情况? 每当你在上传或下载文件时,都需要发送至少两个命令:一个是“Put”或“Get”命令,告诉服务器你要上传或下载哪个文件;另一个是“Data”命令,用于传输文件数据。因为每个命令都会产生一个“commandFinished”信号,所以在上传或下载文件时,每个调用都会收到两个信号。
    3. 命令id是如何生成的? 在QFtp中,每个命令都有一个唯一的id,称为“命令id”(commandId)。命令id是通过一个计数器(commandIdCounter)生成的。每当你发送一个命令时,QFtp就会为命令分配一个新的id,并且将计数器加1。因此,每个命令的id都是唯一的,并且是一个连续的整数。 对于上传文件时收到多次命令完成信号的问题,可以使用connect函数的overload版本,通过指定信号接收者的方式解决。 样例代码如下:
    class MyFtpClient : public QObject
    {
        Q_OBJECT
    public:
        MyFtpClient(QObject *parent = nullptr) : QObject(parent)
        {
            connect(&ftp, &QFtp::commandFinished, this, &MyFtpClient::onCommandFinished);
        }
        void uploadFile(const QString &localFilePath, const QString &remoteFilePath)
        {
            // 开始上传文件
            QUrl url("ftp://hostname:21/" + remoteFilePath);
            url.setUserName("username");
            url.setPassword("password");
            url.setPort(21);
            QFile *file = new QFile(localFilePath);
            if (!file->open(QIODevice::ReadOnly))
            {
                qDebug() << "Error: Open file failed.";
                return;
            }
            QByteArray data = file->readAll();
            ftp.put(data, remoteFilePath);
            file->close();
            delete file;
        }
    private slots:
        void onCommandFinished(int commandId, bool error)
        {
            qDebug() << "Command finished, command id:" << commandId << ", error:" << error;
        }
    private:
        QFtp ftp;
    };
    

    在上传文件时,会调用“ftp.put()”函数发送“Put”命令和“Data”命令。当命令执行完成后,会调用“MyFtpClient::onCommandFinished()”函数。为了只响应一次信号,我们使用connect()函数的overload版本,将信号接收者设置为this,将QFtp的命令完成信号连接到MyFtpClient对象的槽函数。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月25日

悬赏问题

  • ¥15 安卓EVS如何开启服务正常实现功能
  • ¥15 canal读取mysql时报错
  • ¥15 关于 S7-PLCSIM Advanced 5.0本地TCP连接无法读写数据
  • ¥15 关于温度改变石墨烯介电性能(关键词-介电常数)
  • ¥150 HDMI分路器LT86102 的输出在890MHz频点处EMC超标8DB
  • ¥15 druid(相关搜索:数据库|防火墙)
  • ¥15 大一python作业
  • ¥15 preLaunchTask"C/C++: aarch64- apple-darwin22-g++-14 生成活动 文件”已终止,退出代码为-1。
  • ¥60 如何鉴定微信小程序数据被篡改过
  • ¥18 关于#贝叶斯概率#的问题:这篇文章中利用em算法求出了对数似然值作为概率表参数,然后进行概率表计算,这个概率表是怎样计算的呀