QFlags tutorial: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
[[Category:snippets]]
[[Category:snippets]]


[toc align_right="yes" depth="3"]
[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 &lt;code&amp;gt;Q_FLAGS&amp;lt;/code&amp;gt;<br />''This macro registers one or several flags types to the meta-object system''
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<br /> {<br /> public:<br /> enum Option {<br /> OptionA = 1, // 000001<br /> OptionB = 2, // 000010<br /> OptionC = 4, // 000100<br /> OptionD = 8, // 001000<br /> OptionE = 16, // 010000<br /> OptionF = 32 // 100000<br /> // … some more options with value which is a power of two<br /> };<br /> Q_DECLARE_FLAGS(Options, Option)<br /> };
<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 &lt;code&amp;gt;Q_DECLARE_FLAGS()&lt;/code&amp;gt; macro expands to <code>typedef QFlags&amp;lt;Enum&amp;gt; Flags;<code> In our case it expandes to &lt;code&amp;gt;typedef QFlags&amp;lt;Option&amp;gt; Options;&lt;/code&amp;gt; where '''Option''' - is an enum name, and '''Options''' - is name for set of flags.
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 &lt;code&amp;gt;Q_DECLARE_OPERATORS_FOR_FLAGS()&lt;/code&amp;gt; macro declares global &lt;code&amp;gt;operator|()&lt;/code&amp;gt; functions for Flags, which is of type &lt;code&amp;gt;QFlags&amp;lt;T&amp;gt;&lt;/code&amp;gt;.
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 &lt;code&amp;gt;Q_DECLARE_FLAGS()&lt;/code&amp;gt; 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 &lt;code&amp;gt;Q_FLAGS()&lt;/code&amp;gt; macro must be used.
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)<br />{<br /> if (flag.testFlag(TestClass::OptionA))<br /> qDebug() &lt;&lt; &quot;A&amp;quot;;<br /> if (flag.testFlag(TestClass::OptionB))<br /> qDebug() &lt;&lt; &quot;B&amp;quot;;<br />}
</code>void test (TestClass::Options flag)
{
if (flag.testFlag(TestClass::OptionA))
qDebug() << "A";
if (flag.testFlag(TestClass::OptionB))
qDebug() << "B";
}


int main()<br />{<br /> test (TestClass::OptionA | TestClass::OptionB);<br /> test (0x1); // error<br />}<code>
int main()
{
test (TestClass::OptionA | TestClass::OptionB);
test (0x1); // error
}<code>


&lt;code&amp;gt;testFlag(flag)&lt;/code&amp;gt; method checks if flag is set in &lt;code&amp;gt;QFlags&amp;lt;/code&amp;gt;.
<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<br />TestClass::Options f2(~f1); // 111100<br />TestClass::Options f3(Foo::OptionA | Foo::OptionC); // 000101<br />TestClass::Options f4(f1^f3); // 000110
</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