我有一个非常简单的基类,它定义了一个带有 READ 和 NOTIFY 的普通 Q_PROPERTY(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 (for someEntries
)。我想使用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
应该仅使用该属性编写对象。
如果不向 a 声明一个 WRITE 选项,在调用时只记录一个警告,这virtual ... = 0
是否BaseClass
可能SingleItem
?