简述: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); }