清理工作应该由析构函数和子父关系来处理。
使您的主对象(主对象)成为 QApplication 的子对象,以便在 QApplication 之前将其及其所有子对象一起销毁。
你确定你杀死了所有的线程吗?如果它是一个带有事件循环的线程一定要调用QThread::quit()
在调用之前退出事件循环QThread::wait()
您还可以使用空QApplication::qAddPostRoutine ( QtCleanUpFunction ptr )
做一些特殊的清理工作。
要调试这些消息,您可以使用QtMsgHandler qInstallMsgHandler ( QtMsgHandler h )
并编写您自己的消息处理程序来捕获这些警告。如果您可以模拟该问题,则可以在消息上设置断点并在堆栈上查看消息来自哪里。
void debugMessageHandler( QtMsgType type, const char *msg ){
if(QString(msg).contains( "The message you can see in the console" )){
int breakPointOnThisLine(0);
}
switch ( type ) {
case QtDebugMsg:
fprintf( stderr, "Debug: %s\n", msg );
break;
case QtWarningMsg:
fprintf( stderr, "Warning: %s\n", msg );
break;
case QtFatalMsg:
fprintf( stderr, "Fatal: %s\n", msg );
abort();
}
}
为了使用析构函数和子父关系进行清理,您可以捕获控制台关闭信号并调用QCoreApplication::exit()
到应用程序实例。
#include <csignal>
#include <QtCore/QCoreApplication>
using namespace std;
struct CleanExit{
CleanExit() {
signal(SIGINT, &CleanExit::exitQt);
signal(SIGTERM, &CleanExit::exitQt);
signal(SIGBREAK, &CleanExit::exitQt) ;
}
static void exitQt(int sig) {
QCoreApplication::exit(0);
}
};
int main(int argc, char *argv[])
{
CleanExit cleanExit;
QCoreApplication a(argc, argv);
return a.exec();
}