添加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