Сегодня благодаря тов. 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" /* можно добавить флагов, но смысл ясен */