QFlags tutorial: Difference between revisions
Jump to navigation
Jump to search
(Sub-categorize; and it's a Tutorial) |
m (Fix small typos) |
||
(One intermediate revision by one other user not shown) | |||
Line 2: | Line 2: | ||
[[Category:Tutorial]] | [[Category:Tutorial]] | ||
== Overview == | ==Overview== | ||
First of all we should write about the macro: | First of all we should write about the macro: | ||
Line 8: | Line 8: | ||
''This macro registers one or several flags types to the meta-object system'' | ''This macro registers one or several flags types to the meta-object system'' | ||
== Example: == | ==Example:== | ||
<code>class TestClass | <code>class TestClass | ||
Line 24: | Line 24: | ||
Q_DECLARE_FLAGS(Options, Option) | Q_DECLARE_FLAGS(Options, Option) | ||
}; | }; | ||
Q_DECLARE_OPERATORS_FOR_FLAGS(TestClass::Options)</code> | Q_DECLARE_OPERATORS_FOR_FLAGS(TestClass::Options)</code> | ||
The '''Q_DECLARE_FLAGS()''' macro expands to '''typedef QFlags<Enum> Flags;''' In our case it | 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_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 | 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 == | ==Usage sample== | ||
<code>void test (TestClass::Options flag) | <code>void test (TestClass::Options flag) | ||
Line 47: | Line 48: | ||
test (TestClass::OptionA | TestClass::OptionB); | test (TestClass::OptionA | TestClass::OptionB); | ||
test (0x1); // error | test (0x1); // error | ||
}</code> | }</code> | ||
The '''testFlag(flag)''' method checks if flag is set in '''QFlags'''. | The '''testFlag(flag)''' method checks if flag is set in '''QFlags'''. | ||
=== Some examples === | ===Some examples=== | ||
<code>TestClass::Options f1(TestClass::OptionA | TestClass::OptionB); // 000011 | <code>TestClass::Options f1(TestClass::OptionA | TestClass::OptionB); // 000011 | ||
Line 57: | Line 59: | ||
TestClass::Options f3(Foo::OptionA | Foo::OptionC); // 000101 | TestClass::Options f3(Foo::OptionA | Foo::OptionC); // 000101 | ||
TestClass::Options f4(f1^f3); // 000110 | TestClass::Options f4(f1^f3); // 000110 | ||
f4.setFlag(TestClass::OptionF).setFlag(TestClass::OptionB, false); //100100, introduced in Qt 5.7 | |||
</code> | </code> |
Latest revision as of 20:52, 27 October 2020
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