网站背景居中怎么做,房子设计图片,沈阳网吧什么时候恢复营业,网站是否需要备案最近在做QT的项目#xff0c;但是一直是带界面#xff08;QT Widgets#xff09;程序#xff0c;前几天收到个需求#xff0c;是要做个socket服务端的桌面程序#xff0c;界面有没有都成#xff0c;然后就想着接着用 QT Widgets 搞#xff0c;结果辛辛苦苦把socket服…最近在做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_ptr 或 std::unique_ptr来管理 Downloader 对象或者确保只传递 Downloader 对象的引用或指针。
然后把代码改成如下了main.cpp的main函数传参
auto downloader std::make_sharedDownloader();
Business* b new Business(cpuid,identifying,downloader);
Business的构造改成如下
Business::Business(QString device_id,QString identifying,std::shared_ptrDownloader downloader2) : QObject(), downloader1(downloader2) { }
然后在这个构造函数里用downloader1下载测试了下也下载成功了说明排查的方向没有错继续。
在需要下载的地方我的是mqtt消息的回调函数里全部使用downloader1进行下载然后又遇到了第三个报错如下
QObject: Cannot create children for a parent that is in a different thread. (Parent is QNetworkAccessManager(0x57ea93b13d48), parents thread is QThread(0x57ea93b0ebc0), current thread is QThread(0x740ebc0013a0)
说是线程不一致然后用到了信号和槽函数修改后的Business的构造如下
Business::Business(QString device_id,QString identifying,std::shared_ptrDownloader 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也是才自学了几天被这几个问题搞了二三天记录一下下不再犯。