Qt tcpscoekt遇到的问题和一些解决办法

先说明一下我的接收发送是放在线程池里的
1  

write()函数数据不发送 (),这个不发送是指我循环执行write()函数,退出循环后我的数据依然在缓冲区,后续也没把数据发送出去。

先说我发现的一个会导致这个现象的原因,write()写在槽函数里面(可能和我socket放在线程池里有关)。

解决办法的话 别写在槽函数里就行了,使用waitForBytesWritten(),或者flush()也可以。waitForBytesWritten()会随机失败,这个要注意一下。

2

传完图片的时候,断开了和readyRead()信号的连接,准备退出线程的时候(我用了事件循环和线程池,传输完的时候调用了quit()),还是调用了槽函数,导致程序异常退出。这个问题挺随机的,概率触发。(可能描述的不太准确,有错请指出)

槽函数开头写了一个判断,图片传输完了直接return()(我也是不是很懂为什么这样可以,就是我发现每次出现这个问题的时候,槽函数能执行我开头的一条qDebug()输出,然后程序崩溃,所以试了一下)。

这个应该是我线程使用的不对导致,大家可以忽略

3

接收数据的时候数据丢失,执行read()或 readAll()读取数据的时候卡住,调试时提示段错误,导致程序未响应。

目前已经找到了原因所在,是我使用线程方面有问题导致的。  

这个没有解决,如果有知道怎么请告诉我,谢谢!谢谢!谢谢!

找了好久一直以为是接收或者发送的逻辑出错了,后来发现是线程问题。现在终于发现了问题所在

    connect(socket,&QTcpSocket::readyRead,this,[this,socket](){
        this->recework(socket);
     });

这是我的连接函数,这个this就是问题所在。工作类是属于主线程的,那么这里用this的话根据qt默认的连接方式,这个匿名函数就会在主线程执行。所以只要将连接方式改为

Qt::DirectConnection或者将this去掉也是可以的。

4

我把我的项目发给我同学测试传图片功能的时候出现了头数据错误的情况(10次会出现8次)。

我的头数据是由文件信息大小+文件信息+文件大小组成的,在我判断连接服务器成功后就会开始打开文件发送数据,下面是我解数据的代码(分开接收也可以,虽然照样会有头数据出错的现象,我是局域网的就直接全部读进来)

stream>>filenameInformation_size>>fileInformationT>>file_size;
读出来的数据是 很大的 随机数+""+很大的随机数
我的解决办法是 在发送头数据前 用QThread::msleep(20)阻塞了一下线程当前线程我是20ms,然后发送完头数据也阻塞20ms。

我也不清楚为什么加了两个阻塞了之后就可以了,因为如果是数据发太快的导致的话,我本机上应该更容易出现这个问题才对,可是我本机上出现问题的概率比较低。如果有知道的请告知,谢谢。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt是一种开发C++图形用户界面的跨平台框架,而且默认情况下是不支持直接输入中文的。不过,我们可以通过以下几种方法来解决这个问题。 第一种方法是使用QLineEdit::setInputMask()函数。该函数可以限制用户在输入框中输入的字符类型。我们可以使用正则表达式来指定输入只允许中文字符。具体步骤是,创建一个QLineEdit对象,然后调用setInputMask()函数,将正则表达式设置为只允许中文字符即可。 第二种方法是使用QInputMethod类。该类提供了一个输入法框架,可以用于处理输入法的相关操作。我们可以通过重新实现QLineEdit的inputMethodEvent()和inputMethodQuery()函数来自定义输入法的行为。具体步骤是,创建一个自定义的QLineEdit对象,然后重写inputMethodEvent()函数,处理中文输入法的相关操作。 第三种方法是使用一个第三方输入法框架,例如Google Pinyin输入法或搜狗输入法等。这些输入法框架可以在Qt应用程序中提供中文输入的功能。具体步骤是,安装并配置选定的输入法框架,然后在Qt应用程序中使用QLineEdit来接受用户的输入。 总的来说,Qt本身是不直接支持中文输入的,但通过上述方法,我们可以解决这个问题。具体的选择可以根据项目需要和开发者的偏好来决定。 ### 回答2: 要解决Qt不能输入中文的问题,可以按照以下步骤进行操作: 1. 检查输入法设置:确保已安装和启用了支持中文输入的输入法软件,如搜狗输入法、QQ拼音输入法等。在操作系统的设置中打开输入法设置,确保所需的中文输入法已启用。 2. Qt应用程序设置:在Qt应用程序的代码中,添加以下代码以启用中文输入支持: ``` QInputMethod *inputMethod = QGuiApplication::inputMethod(); inputMethod->setInputMethodHints(Qt::ImhPreferUppercase); // 忽略输入法大小写 ``` 这将告诉Qt应用程序在输入时使用操作系统设置的输入法。 3. 处理输入事件:在需要接收用户输入并处理的QWidget或QLineEdit等控件的代码中,重写keyPressEvent()方法,以便手动处理输入事件。例如,可以使用QLineEdit的代码示例: ``` void MyLineEdit::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return) { // 处理回车键事件 // ... } else { // 处理其他按键事件 QLineEdit::keyPressEvent(event); // 默认处理其他按键 } } ``` 通过执行上述步骤,您将能够在Qt应用程序中正常输入中文。如果问题仍然存在,可以尝试更新Qt版本或与Qt的开发者社区寻求进一步帮助。 ### 回答3: QT是一种跨平台的C++图形用户界面开发框架,常用于开发各种应用程序。在使用QT开发时,有时会遇到无法输入中文的问题。这个问题可以通过以下几种方法解决: 1. 设置输入法:在QT中,可以通过设置输入法为中文来解决无法输入中文的问题。可以在系统的控制面板或设置界面中找到输入法设置选项,将输入法设置为中文,然后重新启动QT即可。 2. 修改QT的输入法选项:在QT的工具栏中,找到“选项”或“设置”等菜单,进入输入法选项设置页面。检查是否有禁用输入中文的选项,如果有,则取消该选项,并保存设置。重新启动QT后,就可以正常输入中文了。 3. 使用中文输入法软件:如果以上方法无效,可以尝试安装第三方的中文输入法软件,如搜狗输入法、百度输入法等。安装完毕后,在QT中选择该中文输入法作为默认输入法,重新启动QT即可实现中文输入。 总之,无法输入中文的问题通常是由于输入法设置不正确或者禁用了中文输入引起的。通过适当的输入法设置或者安装中文输入法软件,可以解决QT无法输入中文的问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值