Q_PROPERTY

简述:Q_PROPERTY() 是一个宏,用来在一个类中声明一个属性property,由于该宏是qt特有的,需要用moc进行编译,故必须继承于QObject类。


1、Q_PROPERTY宏定义格式


Q_PROPERTY宏定义格式如下:

Q_PROPERTY(type name

           READ getFunction

           [WRITE setFunction]

           [RESET resetFunction]

           [DESIGNABLE bool]

           [SCRIPTABLE bool]

           [STORED bool])


2、Q_PROPERTY宏定义分析


property特点:

1.必须有一个read函数

2.有一个可选write函数

3.如果定义了"stored"属性表明这是一直存在的。

4.一个reset函数能够把property设置成其默认状态

5.一个"designable"属性表明该property能在GUI builder(一般为Qt Designer)可见


3、例子


头文件:

class QRecentFilesMenu : public QMenu
{
    Q_OBJECT
    Q_PROPERTY(int maxCount READ maxCount WRITE setMaxCount)
    Q_PROPERTY(QString format READ format WRITE setFormat)
public:
    //! Constructs a menu with parent parent.
    explicit QRecentFilesMenu(QWidget* parent = 0);

    //! Constructs a menu with a title and a parent.
    QRecentFilesMenu(const QString &title, QWidget* parent = 0);

    //! Returns the maximum number of entries in the menu.
    int maxCount() const;

    /** This property holds the string used to generate the item text.
     * %d is replaced by the item number
     * %s is replaced by the item text
     * The default value is "%d %s".
     */
    void setFormat(const QString &format);

    //! Returns the current format. /sa setFormat
    const QString &format() const;

    /** Saves the state of the recent entries.
     * Typically this is used in conjunction with QSettings to remember entries
     * for a future session. A version number is stored as part of the data.
     * Here is an example:
     * QSettings settings;
     * settings.setValue("recentFiles", recentFilesMenu->saveState());
     */
    QByteArray saveState() const;

    /** Restores the recent entries to the state specified.
     * Typically this is used in conjunction with QSettings to restore entries from a past session.
     * Returns false if there are errors.
     * Here is an example:
     * QSettings settings;
     * recentFilesMenu->restoreState(settings.value("recentFiles").toByteArray());
     */
    bool restoreState(const QByteArray &state);

public slots:
    //!
    void addRecentFile(const QString &fileName);

    //! Removes all the menu's actions.
    void clearMenu();

    //! Sets the maximum number of entries int he menu.
    void setMaxCount(int);
signals:
    //! This signal is emitted when a recent file in this menu is triggered.
    void recentFileTriggered(const QString &filename);

private slots:
    void menuTriggered(QAction*);
    void updateRecentFileActions();
private:
    int m_maxCount;
    QString m_format;
    QStringList m_files;
};


cpp文件

#include "QRecentFilesMenu.h"

#include <QFileInfo>

static const qint32 RecentFilesMenuMagic = 0xff;

QRecentFilesMenu::QRecentFilesMenu(QWidget* parent)
    : QMenu(parent)
    , m_maxCount(5)
    , m_format(QLatin1String("%d %s"))
{
    connect(this, &QRecentFilesMenu::triggered,
            this, &QRecentFilesMenu::menuTriggered);

    setMaxCount(m_maxCount);
}

QRecentFilesMenu::QRecentFilesMenu(const QString &title, QWidget* parent)
    : QMenu(title, parent)
    , m_maxCount(5)
    , m_format(QLatin1String("%d %s"))
{
    connect(this, &QRecentFilesMenu::triggered,
            this, &QRecentFilesMenu::menuTriggered);
    setIcon(QIcon(":/icons/recent_icon"));
    setMaxCount(m_maxCount);
}

void QRecentFilesMenu::addRecentFile(const QString &fileName)
{
    m_files.removeAll(fileName);
    m_files.prepend(fileName);

    while (m_files.size() > maxCount()) {
        m_files.removeLast();
    }

    updateRecentFileActions();
}

void QRecentFilesMenu::clearMenu()
{
    m_files.clear();

    updateRecentFileActions();
}

int QRecentFilesMenu::maxCount() const
{
    return m_maxCount;
}

void QRecentFilesMenu::setFormat(const QString &format)
{
    if (m_format == format) {
        return;
    }
    m_format = format;

    updateRecentFileActions();
}

const QString &QRecentFilesMenu::format() const
{
    return m_format;
}

QByteArray QRecentFilesMenu::saveState() const
{
    int version = 0;
    QByteArray data;
    QDataStream stream(&data, QIODevice::WriteOnly);

    stream << qint32(RecentFilesMenuMagic);
    stream << qint32(version);
    stream << m_files;

    return data;
}

bool QRecentFilesMenu::restoreState(const QByteArray &state)
{
    int version = 0;
    QByteArray sd = state;
    QDataStream stream(&sd, QIODevice::ReadOnly);
    qint32 marker;
    qint32 v;

    stream >> marker;
    stream >> v;
    if (marker != RecentFilesMenuMagic || v != version) {
        return false;
    }

    stream >> m_files;

    updateRecentFileActions();

    return true;
}

void QRecentFilesMenu::setMaxCount(int count)
{
    m_maxCount = count;

    updateRecentFileActions();
}

void QRecentFilesMenu::menuTriggered(QAction* action)
{
    if (action->data().isValid()) {
        emit recentFileTriggered(action->data().toString());
    }
}

void QRecentFilesMenu::updateRecentFileActions()
{
    int numRecentFiles = qMin(m_files.size(), maxCount());

    clear();

    for (int i = 0; i < numRecentFiles; ++i) {
        QString strippedName = QFileInfo(m_files[i]).fileName();

        QString text = m_format;
        text.replace(QLatin1String("%d"), QString::number(i + 1));
        text.replace(QLatin1String("%s"), strippedName);

        QAction* recentFileAct = addAction(text);
        recentFileAct->setData(m_files[i]);
    }
    addSeparator();
    addAction(QIcon(":/icons/clear_icon"), tr("Clear Menu"), this, SLOT(clearMenu()));

    setEnabled(numRecentFiles > 0);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值