Qt Creator 项目Console 项目踩坑日记

最近在做QT的项目,但是一直是带界面(QT  Widgets)程序,前几天收到个需求,是要做个socket服务端的桌面程序,界面有没有都成,然后就想着接着用 QT  Widgets 搞,结果辛辛苦苦把socket服务的代码写完运行后,用netCat工具指令 nc localhost 1234 模拟客户端去连接socket,一直连不上。。。。

此处连不上是第一个坑:排查命令行用指令搜了所有监听1234端口(我socket服务器代码监听的端口就是1234)的指令,发现搜不到,说明监听根本就没启动,但是代码没报错,中间查阅贼多资料,没结果,直接说结果吧,【服务端项目创建的时候必须选Console Application!】,最后用这个重新见了个项目,同样的代码, nc localhost 1234连上了!!!怀疑是二个创建的权限不一样。

接着开发。。。。。。。到写这个服务端应用更新程序功能的时候,发现下载代码zip的代码没生效,下载文件的目录一直是空的,然后换了好几种写法,发现都不行,然后测试发现同样的下载代码放到main.cpp的main函数下面是可以下载成功的,但是放到别的cpp下就不行!问AI Chat  他说

DownLoader的生命周期在使用的时候被销毁了,然后就想着既然main函数下可以,那可以把DownLoader对象一直穿到使用的cpp不就行了,然后在使用的cpp的构造函数中把它给穿进去了,然后就在构造里接收这个对象的时候报错了  代码如下:
Business::Business(QString device_id,QString identifying,Downloader downloader2) : QObject() { 
 Downloader downloader1 = downloader2;
 } 
上述代码 中Downloader downloader1 = downloader2; 报错了。。。  
接着查原因是:Downloader 对象不能直接拷贝。通常,Qt 中的 QObject 及其派生类(如 Downloader)都是禁止拷贝的,因为它们涉及到复杂的资源管理和对象层次结构。

然后又get到了个新知识点   智能指针(例如 std::shared_ptrstd::unique_ptr)来管理 Downloader 对象,或者确保只传递 Downloader 对象的引用或指针。

然后把代码改成如下了:main.cpp的main函数传参:

auto downloader = std::make_shared<Downloader>();
Business* b = new Business(cpuid,identifying,downloader);

Business的构造改成如下:

Business::Business(QString device_id,QString identifying,std::shared_ptr<Downloader> downloader2) : QObject(), downloader1(downloader2) {   
}

然后在这个构造函数里用downloader1下载测试了下,也下载成功了!说明排查的方向没有错,继续。

在需要下载的地方(我的是mqtt消息的回调函数里)全部使用downloader1进行下载,然后又遇到了第三个报错!,如下:

QObject: Cannot create children for a parent that is in a different thread. (Parent is QNetworkAccessManager(0x57ea93b13d48), parent's thread is QThread(0x57ea93b0ebc0), current thread is QThread(0x740ebc0013a0)

说是线程不一致,然后用到了信号和槽函数,修改后的Business的构造如下:

Business::Business(QString device_id,QString identifying,std::shared_ptr<Downloader> downloader2) : QObject(), downloader1(downloader2){
    connect(this,SIGNAL(test111(const QString&)),this,SLOT(test222(const QString&)));
}

然后在mqtt回调中执行发信号

emit test111(downloadUrl);

在槽函数 中用downloader1进行下载

void Business::test222(const QString str){

  
     qDebug() << "======================================Download Url:" << str;

  
    QString url = str;  // 替换为你要下载的文件的 URL
    QString savePath = "/home/xxxxxxxx/build-socket_server_ttt-Desktop_Qt_5_13_1_GCC_64bit-Debug/tfcard/AAAAAA";  // 替换为保存文件的路径
    downloader1->downloadFile(url, savePath);

  
    QObject::connect(downloader1.get(), &Downloader::downloadProgress, [](qint64 bytesReceived, qint64 bytesTotal) {
            qDebug() << "Download progress:" << bytesReceived << "/" << bytesTotal;
        });

  
   QObject::connect(downloader1.get(), &Downloader::downloadFinished, []() {
            qDebug() << "Download finished!";     
   });
}

测试发了下mqtt消息过去,下载成功了 !QT也是才自学了几天,被这几个问题搞了二三天,记录一下,下不再犯。

相关推荐

  1. Qt Creator 项目Console 项目日记

    2024-07-18 23:26:05       23 阅读
  2. docker compose部署项目记录

    2024-07-18 23:26:05       32 阅读
  3. VSCode之PowerShell中创建项目

    2024-07-18 23:26:05       53 阅读
  4. Eclipse项目导入笔记大全&大全

    2024-07-18 23:26:05       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 23:26:05       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 23:26:05       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 23:26:05       62 阅读
  4. Python语言-面向对象

    2024-07-18 23:26:05       72 阅读

热门阅读

  1. 信息系统项目管理师(高项)—学习笔记三

    2024-07-18 23:26:05       21 阅读
  2. linux修改文件夹下所有文件的权限(常用)

    2024-07-18 23:26:05       21 阅读
  3. c++类的继承详解

    2024-07-18 23:26:05       20 阅读
  4. 目标检测算法

    2024-07-18 23:26:05       23 阅读
  5. 有道云笔记 markdown 生成目录

    2024-07-18 23:26:05       25 阅读
  6. c/c++:多线程下调用exit接口函数的问题

    2024-07-18 23:26:05       21 阅读
  7. 国王(C++)

    2024-07-18 23:26:05       24 阅读
  8. @RequestBody接收到的参数中如何限制List的长度?

    2024-07-18 23:26:05       23 阅读
  9. QEMU源码全解析 —— CPU虚拟化(3)

    2024-07-18 23:26:05       25 阅读