当前位置: 首页 > news >正文

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也是才自学了几天,被这几个问题搞了二三天,记录一下,下不再犯。

http://www.lryc.cn/news/402635.html

相关文章:

  • [MAUI 项目实战] 笔记App(一):程序设计
  • VisualRules-Web案例展示(一)
  • 使用Docker 实现 MySQL 循环复制(三)
  • Spring如何管理Mapper
  • NFS存储、API资源对象StorageClass、Ceph存储-搭建ceph集群和Ceph存储-在k8s里使用ceph(2024-07-16)
  • 「Vue组件化」封装i18n国际化
  • 【Git远程操作】理解分布式管理 | 创建远程仓库
  • OJ-0718
  • python抓包 -- 用wireshark抓包、解析--scapy、PyShark
  • uni-app开发日志:unicloud使用时遇到的问题解决汇总(不断补充)
  • 插入排序算法详解
  • parallel 详细解析 Java 8 Stream API 中的 parallel 方法
  • 不同业务场景下通过mars3d实现绕点旋转效果
  • 重塑水利未来:智慧水利解决方案的探索与实践,从物联网、大数据到人工智能,科技如何赋能水利行业,实现智慧化管理与决策
  • IO、进程、线程03
  • 算法力扣刷题记录 五十二【617.合并二叉树】
  • Java中的ArrayList和LinkedList有什么区别?
  • Linux C++ 058-设计模式之解释器模式
  • MDK5没有DeviceName
  • 在LabVIEW中实现图像矫正
  • Apache httpd-vhosts.conf 配置详解(附Demo)
  • 活动回顾 | AutoMQ 联合 GreptimeDB 共同探讨新能源汽车数据基础设施
  • 格式工厂转换视频分辨率
  • ReAct 大模型提示框架
  • JavaEE:Lombok工具包的使用以及EditStarter插件的安装
  • 基于纹理和统计图像特征集成的计算机辅助乳腺癌检测
  • Java基础 - 简介和配置环境变量
  • 水域救援装备的详细简介_鼎跃安全
  • 二、BIO、NIO、直接内存与零拷贝
  • 生成式AI的发展方向:Chat vs Agent