QFlags tutorial

From Qt Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.


Overview

First of all we should write about the macro:

Q_FLAGS

This macro registers one or several flags types to the meta-object system

Example:

class TestClass
 {
 public:
 enum Option {
 OptionA = 1, // 000001
 OptionB = 2, // 000010
 OptionC = 4, // 000100
 OptionD = 8, // 001000
 OptionE = 16, // 010000
 OptionF = 32 // 100000
 // … some more options with value which is a power of two
 };
 Q_DECLARE_FLAGS(Options, Option)
 };


Q_DECLARE_OPERATORS_FOR_FLAGS(TestClass::Options)

The Q_DECLARE_FLAGS() macro expands to typedef QFlags<Enum> Flags; In our case it expands to typedef QFlags<Option> Options; where Option - is an enum name, and Options - is name for set of flags.

The Q_DECLARE_OPERATORS_FOR_FLAGS() macro declares global operator|() functions for Flags, which is of type QFlags<T>.

The Q_DECLARE_FLAGS() macro does not expose the flags to the meta-object system, so they cannot be used by Qt Script. To make the flags available for this purpose, the Q_FLAGS() macro must be used.

Usage sample

void test (TestClass::Options flag)
{
 if (flag.testFlag(TestClass::OptionA))
 qDebug() << "A";
 if (flag.testFlag(TestClass::OptionB))
 qDebug() << "B";
}

int main()
{
 test (TestClass::OptionA | TestClass::OptionB);
 test (0x1); // error

}

The testFlag(flag) method checks if flag is set in QFlags.

Some examples

TestClass::Options f1(TestClass::OptionA | TestClass::OptionB); // 000011
TestClass::Options f2(~f1); // 111100
TestClass::Options f3(Foo::OptionA | Foo::OptionC); // 000101
TestClass::Options f4(f1^f3); // 000110
f4.setFlag(TestClass::OptionF).setFlag(TestClass::OptionB, false); //100100, introduced in Qt 5.7