Добавление опций в существующий Q_PROPERTY из базового класса только в полученном классе

У меня есть очень простой базовый класс, который определяет нормальный Q_PROPERTY с READ и NOTIFY (WRITE не во всех возможных реализациях возможен).

class BaseClass : public QObject {
    Q_OBJECT
    Q_PROPERTY(QStringList someEntries READ someEntries NOTIFY someEntriesChanged)

public:
    explicit BaseClass(QObject *parent = Q_NULLPTR) : QObject(parent) {}
    virtual ~BaseClass() {}

    virtual QStringList someEntries() const = 0;

    void processEntries() {
        for(auto entry : someEntries()) {
            //process entry
        }
    }

Q_SIGNALS:
    void someEntriesChanged(const QStringList &someEntries);
};

Теперь у меня есть 2 класса заблуждения, из которых один поддерживает только одну запись (SingleItem), а другой поддерживает несколько записей (MultiItem).

SingleItem преобразует один член QString в QStringList по запросу и позволяет установить его, используя свойство, вызываемое по-разному (theEntry):

class SingleItem : public BaseClass {
    Q_OBJECT
    Q_PROPERTY(QString theEntry READ theEntry WRITE setTheEntry NOTIFY theEntryChanged);

public:
    explicit SingleItem(QObject *parent = Q_NULLPTR) : BaseClass(parent) {}
    virtual ~SingleItem() {}

    const QString &theEntry() const { return m_theEntry; }
    void setTheEntry(const QString &theEntry) {
        if(m_theEntry != theEntry)
            Q_EMIT theEntryChanged(m_theEntry = theEntry);
    }

    // BaseClass interface
    QStringList someEntries() const Q_DECL_OVERRIDE
    { return QStringList { m_theEntry }; }

Q_SIGNALS:
    void theEntryChanged(const QString &theEntry);

private:
    QString m_theEntry;
};

MutliItem хранит QStringList (для someEntries). Я хотел бы записать в этот QStringList, используя свойство, определенное в BaseClass, Но я не знаю, как добавить опцию WRITE к уже определенной Q_PROPERTY.

class MultiItem : public BaseClass {
    Q_OBJECT
    //Somehow add the setSomeEntries method to the property?

public:
    explicit MultiItem(QObject *parent = Q_NULLPTR) : BaseClass(parent) {}
    virtual ~MultiItem() {}

    void setSomeEntries(const QStringList &someEntries) {
        if(m_someEntries != someEntries)
            Q_EMIT someEntriesChanged(m_someEntries = someEntries);
    }

    // BaseClass interface
    QStringList someEntries() const Q_DECL_OVERRIDE{ return m_someEntries; }

private:
    QStringList m_someEntries;
};

Я не могу добавить опцию WRITE в BaseClass потому что это будет нарушать смысл. Не каждый объект BaseClass позволяет установить это свойство, но объекты MultiItem должно быть написано только с использованием этого свойства.

Возможно ли это как-то без объявления опции WRITE virtual ... = 0 в BaseClass это просто записывает предупреждение при вызове SingleItem?

0 ответов

Другие вопросы по тегам