Qt wiki will be updated on October 12th 2023 starting at 11:30 AM (EEST) and the maintenance will last around 2-3 hours. During the maintenance the site will be unavailable.
QFlags tutorial: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
[[Category:snippets]] | [[Category:snippets]] | ||
[toc align_right= | [toc align_right="yes" depth="3"] | ||
= Simple tutorial for safe-usage QFlags = | = Simple tutorial for safe-usage QFlags = | ||
Line 7: | Line 7: | ||
== Overview == | == Overview == | ||
First of all we should write about macro | First of all we should write about macro <code>Q_FLAGS</code> | ||
''This macro registers one or several flags types to the meta-object system'' | |||
== Example: == | == Example: == | ||
<code>class TestClass | <code>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)</code> | Q_DECLARE_OPERATORS_FOR_FLAGS(TestClass::Options)</code> | ||
The | The <code>Q_DECLARE_FLAGS()</code> macro expands to <code>typedef QFlags<Enum> Flags;<code> In our case it expandes to <code>typedef QFlags<Option> Options;</code> where '''Option''' - is an enum name, and '''Options''' - is name for set of flags. | ||
The | The <code>Q_DECLARE_OPERATORS_FOR_FLAGS()</code> macro declares global <code>operator|()</code> functions for Flags, which is of type <code>QFlags<T></code>. | ||
The | The <code>Q_DECLARE_FLAGS()</code> 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 these purpose, the <code>Q_FLAGS()</code> macro must be used. | ||
== Usage sample == | == Usage sample == | ||
</code>void test (TestClass::Options flag) | </code>void test (TestClass::Options flag) | ||
{ | |||
if (flag.testFlag(TestClass::OptionA)) | |||
qDebug() << "A"; | |||
if (flag.testFlag(TestClass::OptionB)) | |||
qDebug() << "B"; | |||
} | |||
int main() | int main() | ||
{ | |||
test (TestClass::OptionA | TestClass::OptionB); | |||
test (0x1); // error | |||
}<code> | |||
<code>testFlag(flag)</code> method checks if flag is set in <code>QFlags</code>. | |||
=== Some example === | === Some example === | ||
</code>TestClass::Options f1(TestClass::OptionA | TestClass::OptionB); // 000011 | </code>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 |
Revision as of 09:00, 25 February 2015
[toc align_right="yes" depth="3"]
Simple tutorial for safe-usage QFlags
Overview
First of all we should write about 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;<code> In our case it expandes to <code>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 these 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
}
<code>testFlag(flag)
method checks if flag is set in
QFlags
.
Some example
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