Совместная библиотека c ++ + проблема с назначением QList - PullRequest
0 голосов
/ 02 января 2019

Я создал общую библиотеку, используя 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>                                                                                     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...