Сегодня благодаря тов. SABROG вспомнил одну полезную вещь, реализацией которой сам когда-то мучался — реализация удобной системы флагов для класса. Долгое время эта реализация у меня хранилась в архиве «полезных штучек» для класса uTestOptionsClass и.. в общем, не особо это удобно для просмотра. Так что выкладываю более удобную для прочтения и запоминания запись.
//---------------------------------------------------------------------
// File: uflagtestclass.h
//---------------------------------------------------------------------
#ifndef UFLAGTESTCLASS_H
#define UFLAGTESTCLASS_H
#include <QObject>
//---------------------------------------------------------------------
// Name: MyClass
// Desc:
//---------------------------------------------------------------------
class MyClass : public QObject
{
Q_OBJECT
Q_FLAGS(MyMode)
public:
explicit MyClass(QObject* parent = 0);
enum MyModeFlag {
NoOptions = 0,
Option1 = 1L << 0,
Option2 = 1L << 1,
Option3 = 1L << 2
// and another options you want...
};
Q_DECLARE_FLAGS(MyMode, MyModeFlag)
void setMode(MyMode mode);
inline MyMode mode() const;
private:
MyMode m_mode;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(MyClass::MyMode)
inline MyClass::MyMode MyClass::mode() const { return m_mode; }
// Debug output
//---------------------------------------------------------------------
class QDebug;
QDebug operator << (QDebug debug, MyClass::MyMode mode);
#endif // UFLAGTESTCLASS_H
//----------------------------------------------------------------------
// File: uflagtestclass.cpp
//----------------------------------------------------------------------
#include <QDebug>
#include <QMetaEnum>
#include "uflagtestclass.h"
//----------------------------------------------------------------------
// MyClass class constructor
//----------------------------------------------------------------------
MyClass::MyClass(QObject* parent)
: QObject(parent), m_mode(MyClass::NoOptions)
{
}
//----------------------------------------------------------------------
void MyClass::setMode(MyMode mode)
{
m_mode = mode;
}
// Debug output
//----------------------------------------------------------------------
QDebug operator << (QDebug debug, MyClass::MyMode mode)
{
const QMetaObject& mo_flag = MyClass::staticMetaObject;
int index = mo_flag.indexOfEnumerator("MyMode");
QMetaEnum me_flag = mo_flag.enumerator(index);
debug << me_flag.valueToKeys(mode);
return debug;
}
Искренне признаюсь, что позаимствовал название классов и функцию вывода в qDebug() у тов. SABROG — после публикации в виде uTestOptionsClass я посмотрел на результат и понял, что читать его сложно. Поменял на flag и MyClass.
Ах, да, результат вывода в консоль:
"Option2|Option3" /* можно добавить флагов, но смысл ясен */