Класс, расширяющий конструктор QObject "является закрытым в этом контексте" - PullRequest
2 голосов
/ 17 января 2020

Я пытаюсь создать класс, расширяющий QObject, который содержит список другого класса, расширяющего QObject. При построении объекта списка я передаю объект в конструктор, содержащий все точки, необходимые для построения моих объектов. Однако у меня проблема с тем, что мои конструкторы как-то помечены как частные.

//PDFOutline.h
public:
    Q_OBJECT

    Q_PROPERTY( QString name READ name CONSTANT )

    PDFOutlineItem( Poppler::OutlineItem outline, QObject* parent = nullptr );
    PDFOutlineItem( QObject* parent = nullptr);

    QString name() { return m_text; }

private:
    //QList<PDFOutlineItem> m_children;
    int m_page;
    QString m_text;
};

class PDFOutline : public QObject
{
public:
    Q_OBJECT

    PDFOutline( QVector<Poppler::OutlineItem> outline, QObject* parent = nullptr );
    PDFOutline( QObject* parent = nullptr );

    //QList<PDFOutlineItem> getOutline() { return m_outline; }

private:
    QList<PDFOutlineItem*> m_outline;
};
//PDFOutline.cpp
PDFOutline::PDFOutline( QVector<Poppler::OutlineItem> outline, QObject* parent )
    : QObject( parent )
{
    for( auto item : outline )
    {
        m_outline.append( new PDFOutlineItem( item, this ) );  //This is the line throwing the error
    }
}

PDFOutline::PDFOutline( QObject* parent )
    : QObject( parent )
{
}

PDFOutlineItem::PDFOutlineItem( Poppler::OutlineItem outlineItem, QObject* parent )
    : QObject( parent ),
      m_page( outlineItem.destination()->pageNumber() ),
      m_text( outlineItem.name() )
{
}

PDFOutlineItem::PDFOutlineItem( QObject* parent )
    : QObject( parent )
{
}

Ошибка вывода следующая:

In file included from TechnicalPublications/PDFOutline.cpp:1:0:
TechnicalPublications/PDFOutline.h: In constructor 'TechnicalPublications::PDFOutline::PDFOutline(QVector<Poppler::OutlineItem>, QObject*)':
TechnicalPublications/PDFOutline.h:17:2: error: 'TechnicalPublications::PDFOutlineItem::PDFOutlineItem(Poppler::OutlineItem, QObject*)' is private
  PDFOutlineItem( Poppler::OutlineItem outline, QObject* parent = nullptr );
  ^
TechnicalPublications/PDFOutline.cpp:13:52: error: within this context
   m_outline.append( new PDFOutlineItem( item, this ) );
                                                    ^

Надеюсь, мне не хватает чего-то глупого , но возможно ли это? Моя цель - использовать это в QML для заполнения ListView, но я, кажется, не могу обойти этот вопрос.

Есть мысли?

1 Ответ

6 голосов
/ 17 января 2020

Проблема в том, куда вы кладете Q_OBJECT. Вот определение, которое у меня есть:

/* qmake ignore Q_OBJECT */
#define Q_OBJECT \
public: \
    QT_WARNING_PUSH \
    Q_OBJECT_NO_OVERRIDE_WARNING \
    static const QMetaObject staticMetaObject; \
    virtual const QMetaObject *metaObject() const; \
    virtual void *qt_metacast(const char *); \
    virtual int qt_metacall(QMetaObject::Call, int, void **); \
    QT_TR_FUNCTIONS \
private: \
    Q_OBJECT_NO_ATTRIBUTES_WARNING \
    Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \
    QT_WARNING_POP \
    struct QPrivateSignal {}; \
    QT_ANNOTATE_CLASS(qt_qobject, "")

Обратите внимание, что он имеет спецификаторы доступа public: и private:, все, что после Q_OBJECT будет приватным. Так что вам нужно поставить перед вашим public:

...