Добавление опций в существующий 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?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]