c++ - Qt app crash on build release but not on debug release -
is there commun issues cause app crash on release build not on debug build ?
the app crash on destruction.
i didn't post code cause don't know bug, , app quite big.
is there anyway can debug release build ??
edit: think problem when app main object destructor called , trying delete qqmlapplicationengine, application main object qobject holding pointer qqmlapplicationengine , it's engine parent.
application.h:
#ifndef application_h #define application_h #include <qobject> #include <qqmlapplicationengine> #include <qsqlitesettings> #include "pluginloader.h" #include "notificationmodel.h" #define main_qml_file "qrc:/qml/main.qml" #define ui_reportpresneter_name "uiireportcontainer" class application : public qobject { q_object q_property(bool loadingplugin read loadingplugin notify loadingpluginchanged) public: explicit application(qobject *parent = nullptr); virtual ~application(); bool loadingplugin() const; signals: void loadingpluginchanged(bool loadingplugin); public slots: void setloadingplugin(bool loadingplugin); void handlereport(ireport* report); private slots: void addaffairstatereporttoui(ireport* item); void showreportdetails(qquickitem* item); private: pluginloader* _loader; qqmlapplicationengine* _engine; qsqlitesettings* _settings; notificationmodel* _notificationmodel; qobject* _uirootobject; private: // methods void setuprootcontextproperties(); void setupqmlengine(); void setuppluginloader(); private: // friends classes friend class pluginloader; bool _loadingplugin; }; #endif // application_h application.cpp:
#include "application.h" #include <qcoreapplication> #include <qqmlcontext> #include <qvariant> #include <qstring> #include <qdebug> #include <qmetaobject> #include <plugininterfaces/ireport.h> application::application(qobject *parent) : qobject(parent), _loader(new pluginloader(*this, this)), _engine(new qqmlapplicationengine(this)), _settings(new qsqlitesettings(qsettings::userscope, this)), _notificationmodel(new notificationmodel(this)) { setupqmlengine(); setuppluginloader(); _loader->loadplugins(); } application::~application() { qdebug() << "application dest called"; qdebug() << this->children(); } bool application::loadingplugin() const { return _loadingplugin; } void application::setloadingplugin(bool loadingplugin) { if (_loadingplugin == loadingplugin) return; _loadingplugin = loadingplugin; emit loadingpluginchanged(_loadingplugin); } void application::setuprootcontextproperties() { _engine->rootcontext()->setcontextproperty("notificationmodel", _notificationmodel); _engine->rootcontext()->setcontextobject(this); } void application::setupqmlengine() { setuprootcontextproperties(); _engine->load(qurl(main_qml_file)); if(_engine->rootobjects().isempty()) { qcritical() << "unable load main qml file."; exit(exit_failure); } _uirootobject = _engine->rootobjects()[0]; qinfo() << "ui root object : " << _uirootobject; } void application::setuppluginloader() { qobject::connect(_loader, &pluginloader::loadingstarted, [&](){ this->setloadingplugin(true); }); qobject::connect(_loader, &pluginloader::loadingfinished, [&](){ this->setloadingplugin(false); }); } void application::addaffairstatereporttoui(ireport *item) { if (item == nullptr) return; qquickitem* = item->overview(); if(i == nullptr) { return; } qmetaobject::invokemethod(_uirootobject, "newaffairstatereport", q_arg(qvariant, qvariant::fromvalue(i))); qobject::connect(item, signal(showdetails(qquickitem*)), this, slot(showreportdetails(qquickitem*))); } void application::showreportdetails(qquickitem *item) { if (item == nullptr) return; qmetaobject::invokemethod(_uirootobject, "showreportdetails", q_arg(qvariant, qvariant::fromvalue(item))); } void application::handlereport(ireport* report) { switch (report->type()) { case ireport::type::affairstate: addaffairstatereporttoui(report); break; case ireport::type::financialstate: case ireport::type::planstate: case ireport::type::sitestate: case ireport::type::miscellaneous: break; } } system info:
windows 10
64bits
qt 5.9.1
msvc2017
Comments
Post a Comment