У меня есть очень простой базовый класс, который определяет нормальный 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
?
Задача ещё не решена.
Других решений пока нет …