Я создал общую библиотеку, используя pimpl.
Ниже приведены несколько классов, связанных с проблемой, с которой я сталкиваюсь:
class PlotPrivate;
class RESTAPILIB_EXPORT Plot : public IFarmObject
{
using IFarmObject::IFarmObject;
Q_DISABLE_COPY(Plot)
Q_OBJECT
...
Q_PROPERTY(QList<QGeoCoordinate> coordinates READ coordinates WRITE setCoordinates NOTIFY coordinatesChanged)
...
public:
void setCoordinates(const QList<QGeoCoordinate> &coordinates);
QList<QGeoCoordinate> coordinates() const;
Q_INVOKABLE QVariantList coordinatesQml() const;
QPolygonF coordinatesPolygon() const;
...
signals:
void coordinatesChanged(QList<QGeoCoordinate> coordinates);
private:
Q_DECLARE_PRIVATE(Plot)
};
...
class PlotPrivate : public IFarmObjectPrivate
{
public:
PlotPrivate(Plot *q, const QString &id, IObject::ObjectType type = IObject::PLOT);
...
public:
QList<QGeoCoordinate> m_coordinates;
Q_DECLARE_PUBLIC(Plot)
};
...
Plot::Plot(const QString &id)
: IFarmObject(new PlotPrivate(this, id))
{
}
...
void Plot::setCoordinates(const QList<QGeoCoordinate> &coordinates)
{
Q_D(Plot);
d->m_coordinates = coordinates;
d->m_area = 0.0;
if (d->m_coordinates.size() > 2)
d->m_area = abs(getArea(coordinatesPolygon()));
//TODO: render m_image
emit coordinatesChanged(d->m_coordinates);
emit areaChanged(d->m_area);
}
...
const QList<QGeoCoordinate> GeoCoordinatesModel::coordinates() const
{
QList<QGeoCoordinate> lst;
if (m_lst.size() > 2)
{
foreach (GeoCoordinateEntry *e, m_lst) {
lst << e->coordinate();
}
}
return lst;
}
...
void wgFarmPlotEditor::savePlot(Plot *plot)
{
Plot *p = new Plot(plot);
QList<QGeoCoordinate> coords = p_coordinatesModel->coordinates();
p->setCoordinates(coords);
newRequestUpdt(p);
p->deleteLater();
p_coordinatesModel->resetModel();
}
В общей библиотеке Plot является указателем.
Когда вызывается слот wgFarmPlotEditor :: savePlot (), мое приложение падает на следующую часть: p-> setCoordinates (ordins);
Я пытаюсь понять, почему это происходит.
Я верю, что есть что-то общее с неявным обменом информацией, но я не знаю почему.
Есть мысли?
Примечание: я скрыл часть кода для лучшего чтения ..
Примечание 2: IFarmObject и IFarmObjectPrivate, оба наследуют от QObject, также оба имеют свои соответствующие объекты d_ptr и q_ptr.
Примечание 3: я написал классы, следуя этому руководству: https://wiki.qt.io/D-Pointer
Примечание 4: класс wgFarmPlotEditor
находится в другой общей библиотеке .. не уверен, что это что-то меняет.
Ниже находится трассировка стека аварии:
1 QGenericAtomicOps<QAtomicOpsBySize<4>>::load<int> qgenericatomic.h 90 0xf2e29d6
2 QBasicAtomicInteger<int>::load qbasicatomic.h 103 0xf2e5dc0
3 QtPrivate::RefCount::deref qrefcount.h 66 0xf2e4701
4 QList<QGeoCoordinate>::~QList<QGeoCoordinate> qlist.h 826 0xf3215d0
5 QList<QGeoCoordinate>::operator= qlist.h 506 0xf3216e5
6 Plot::setCoordinates plot.cpp 40 0xf31f463
7 wgFarmPlotEditor::savePlot wgfarmploteditor.cpp 77 0x3b66417
8 wgFarmPlotEditor::qt_static_metacall moc_wgfarmploteditor.cpp 98 0x3b7341e
9 wgFarmPlotEditor::qt_metacall moc_wgfarmploteditor.cpp 154 0x3b7335a
10 QMetaObject::metacall qmetaobject.cpp 302 0x665b7780
11 QQmlObjectOrGadget::metacall qqmlpropertycache.cpp 1733 0x429eaa1
12 CallMethod qv4qobjectwrapper.cpp 1177 0x41abe23
13 CallPrecise qv4qobjectwrapper.cpp 1437 0x41ac7bc
14 QV4::QObjectMethod::callInternal qv4qobjectwrapper.cpp 1975 0x41aa65a
15 QV4::QObjectMethod::call qv4qobjectwrapper.cpp 1913 0x41aa2de
16 QV4::FunctionObject::call qv4functionobject_p.h 163 0x3fd0714
17 QV4::Runtime::method_callProperty qv4runtime.cpp 1062 0x41d06a6
18 QV4::Moth::VME::exec qv4vme_moth.cpp 800 0x41bfd32
19 QV4::Moth::VME::exec qv4vme_moth_p.h 72 0x3fd5ad0
20 QV4::Function::call qv4function_p.h 72 0x3fd06d0
... <More>