QT - 【耻辱柱】踩坑记录

添加Q_OBJECT出错

在一未添加 Q_OBJECT 的头文件,加入该宏,编译时程序多处报错

解决方法:清理项目并重新构建。

2020.4.7

跨线程使用对象

起初在 UOS (一国产Linux)下进行 Qt 开发,在给程序添加完 TCP 心跳检测线程后,会自动断开链接。

初次运行效果正常,当再次链接又检测到网络断开后,程序奔溃闪退,且无错误提示。

其实是有跨线程使用Socket的警告的,只是我完全没注意…毕竟不是闪退的时候才出现…

在这里插入图片描述
迁移至 Ubuntu18.04,存在同样的问题。

最后迁移至 Window ,以下错误提示引起注意:

ASSERT failure in QCoreApplication::sendEvent: "Cannot send events to objects owned by a different thread. Current thread 0x0x1d7cdb00. Receiver '' (of type 'QNativeSocketEngine') was created in thread 0x0x192be0f0", file kernel\qcoreapplication.cpp, line 563

即跨线程访问对象。

解决方法:

最终将心跳线程的Socket操作去除,心跳线程改为定时间发送一信号,通知主线程发送心跳包并检测应答信号。

当然也可以在线程中创建创建socket对象。或者通过指针传递进去。

小结Thread 对象本身工作在主线程下,即使调用其定义的变量和方法,也是工作在主线程下,只有 run( ) 范围内的代码才工作在子线程中。为避免跨线程调用引起异常,一个对象的创建和调用要放在同一线程中。

2020.4.15

txt文件保存中文不全的问题

先看一下我原先文件保存是怎么写的:

        QString saveFile = "";
        //借助QFileDialog获取保存路径及文件名
        saveFile = QFileDialog::getSaveFileName(this,"保存","","文本文件(*.txt)");
        QString filepath = QFileInfo(saveFile).absolutePath();
        QString filename = QFileInfo(saveFile).fileName();
        
        QDir mDir;
        //保存当前路径
        QString currentDir = mDir.currentPath();
        
        QFile *tempFile = new QFile();
        //设置保存路径
        mDir.setCurrent(filepath);
        
        tempFile->setFileName(filename);
        if(tempFile->open(QIODevice::WriteOnly|QIODevice::Text)){
    
    
            QString wStr = ui->textBrowser_intput->document()->toPlainText();
            tempFile->write(wStr.toLocal8Bit().data(),wStr.length());
            tempFile->close();
        }
        else{
    
    
            setNewsColor(Qt::red);
            mlaybelNews->setText("Save File Error!");
        }
        setNewsColor(Qt::black);
        mlaybelNews->setText("Save File Success!");
        //程序路径复原
        mDir.setCurrent(currentDir);
    }

可以看到,使用 write( ) 该方法需要指定一个 char*数据长度

看着是滴水不漏,实际真的是如此吗?

一旦文本中出现中文或者时,使用这种方法由于默认保存格式是 GBK ,一个 汉字两个字节 。所以这里的计算出来的长度是不对的。这样保存就会造成数据不全的问题。

解决方法

借助 QTextStream

            QTextStream streamFileOut(tempFile);
            streamFileOut.setCodec("UTF-8");
            streamFileOut << wStr;
            streamFileOut.flush();

2020.5.17

猜你喜欢

转载自blog.csdn.net/weixin_40774605/article/details/105542546