1

我有一个非常简单的基类,它定义了一个带有 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

4

0 回答 0