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
つまり、オブジェクトへのクロススレッドアクセスです。
解決:
最後に、ハートビートスレッドのソケット操作が削除され、ハートビートスレッドが変更されて、一定時間に信号を送信し、メインスレッドにハートビートパケットを送信して応答信号を検出するように通知します。
もちろん、スレッド内にソケットオブジェクトを作成することもできます。または、ポインタで渡します。
要約: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( )
このメソッドを使用してachar*
とを指定していることがわかります数据长度
。
それはとても滴り落ちるように見えます、それは本当に本当ですか?
中国いったん既定の保存形式であるため、この方法を使用して、表示されるテキスト、または会計。したがって、ここで計算された長さは間違っています。この保存により、データが不完全になります。GBK
汉字
两个字节
解決策:
の助けを借りて QTextStream
QTextStream streamFileOut(tempFile);
streamFileOut.setCodec("UTF-8");
streamFileOut << wStr;
streamFileOut.flush();
2020.5.17