Browse Source
Passing parameters QVariantMap across C++ boundary was causing crashes in Qt due to Qml array bugs. Referencing same Fact* across Qml boundary in multiple QQuickWidgets caused jScript GC to crash.QGC4.4
21 changed files with 378 additions and 218 deletions
@ -0,0 +1,106 @@
@@ -0,0 +1,106 @@
|
||||
/*=====================================================================
|
||||
|
||||
QGroundControl Open Source Ground Control Station |
||||
|
||||
(c) 2009 - 2014 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
|
||||
|
||||
This file is part of the QGROUNDCONTROL project |
||||
|
||||
QGROUNDCONTROL is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
QGROUNDCONTROL is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
======================================================================*/ |
||||
|
||||
/// @file
|
||||
/// @author Don Gagne <don@thegagnes.com>
|
||||
|
||||
#include "FactBinder.h" |
||||
#include "UASManager.h" |
||||
#include "AutoPilotPluginManager.h" |
||||
|
||||
FactBinder::FactBinder(void) : |
||||
_autopilotPlugin(NULL), |
||||
_fact(NULL) |
||||
{ |
||||
UASInterface* uas = UASManager::instance()->getActiveUAS(); |
||||
Q_ASSERT(uas); |
||||
|
||||
_autopilotPlugin = AutoPilotPluginManager::instance()->getInstanceForAutoPilotPlugin(uas); |
||||
Q_ASSERT(_autopilotPlugin); |
||||
Q_ASSERT(_autopilotPlugin->pluginIsReady()); |
||||
} |
||||
|
||||
QString FactBinder::name(void) const |
||||
{ |
||||
if (_fact) { |
||||
return _fact->name(); |
||||
} else { |
||||
return QString(); |
||||
} |
||||
} |
||||
|
||||
void FactBinder::setName(const QString& name) |
||||
{ |
||||
if (_fact) { |
||||
disconnect(_fact, &Fact::valueChanged, this, &FactBinder::valueChanged); |
||||
_fact = NULL; |
||||
} |
||||
|
||||
if (!name.isEmpty()) { |
||||
if (_autopilotPlugin->factExists(name)) { |
||||
_fact = _autopilotPlugin->getFact(name); |
||||
connect(_fact, &Fact::valueChanged, this, &FactBinder::valueChanged); |
||||
} else { |
||||
Q_ASSERT(false); |
||||
} |
||||
} |
||||
|
||||
emit valueChanged(); |
||||
emit nameChanged(); |
||||
} |
||||
|
||||
QVariant FactBinder::value(void) const |
||||
{ |
||||
if (_fact) { |
||||
return _fact->value(); |
||||
} else { |
||||
return QVariant(0); |
||||
} |
||||
} |
||||
|
||||
void FactBinder::setValue(const QVariant& value) |
||||
{ |
||||
if (_fact) { |
||||
_fact->setValue(value); |
||||
} else { |
||||
Q_ASSERT(false); |
||||
} |
||||
} |
||||
|
||||
QString FactBinder::valueString(void) const |
||||
{ |
||||
if (_fact) { |
||||
return _fact->valueString(); |
||||
} else { |
||||
return QString(); |
||||
} |
||||
} |
||||
|
||||
QString FactBinder::units(void) const |
||||
{ |
||||
if (_fact) { |
||||
return _fact->units(); |
||||
} else { |
||||
return QString(); |
||||
} |
||||
} |
@ -0,0 +1,69 @@
@@ -0,0 +1,69 @@
|
||||
/*=====================================================================
|
||||
|
||||
QGroundControl Open Source Ground Control Station |
||||
|
||||
(c) 2009 - 2014 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
|
||||
|
||||
This file is part of the QGROUNDCONTROL project |
||||
|
||||
QGROUNDCONTROL is free software: you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation, either version 3 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
QGROUNDCONTROL is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License |
||||
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
======================================================================*/ |
||||
|
||||
/// @file
|
||||
/// @author Don Gagne <don@thegagnes.com>
|
||||
|
||||
#ifndef FACTBINDER_H |
||||
#define FACTBINDER_H |
||||
|
||||
#include "Fact.h" |
||||
#include "AutoPilotPlugin.h" |
||||
|
||||
#include <QObject> |
||||
#include <QString> |
||||
|
||||
/// This object is used to instantiate a connection to a Fact from within Qml.
|
||||
class FactBinder : public QObject |
||||
{ |
||||
Q_OBJECT |
||||
|
||||
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) |
||||
Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged USER true) |
||||
Q_PROPERTY(QVariant valueString READ valueString NOTIFY valueChanged) |
||||
Q_PROPERTY(QString units READ units CONSTANT) |
||||
|
||||
public: |
||||
FactBinder(void); |
||||
|
||||
QString name(void) const; |
||||
void setName(const QString& name); |
||||
|
||||
QVariant value(void) const; |
||||
void setValue(const QVariant& value); |
||||
|
||||
QString valueString(void) const; |
||||
|
||||
/// Read accesor for units property
|
||||
QString units(void) const; |
||||
|
||||
signals: |
||||
void nameChanged(void); |
||||
void valueChanged(void); |
||||
|
||||
private: |
||||
AutoPilotPlugin* _autopilotPlugin; |
||||
Fact* _fact; |
||||
}; |
||||
|
||||
#endif |
Loading…
Reference in new issue