void QWidget::show()
{
Qt::WindowState defaultState = QGuiApplicationPrivate::platformIntegration()->defaultWindowState(data->window_flags);
if (defaultState == Qt::WindowFullScreen)
showFullScreen();
else if (defaultState == Qt::WindowMaximized)
showMaximized();
else
setVisible(true);
}
Qt::WindowState
根据文档,Qt::WindowState是enum类。用于指定当前顶层窗口的状态。
有:
Qt::WindowNoState//无状态
Qt::WindowMinimized//最小化
Qt::WindowMaximized//最大化
Qt::WindowFullScreen//全屏
Qt::WindowActive//活动?
关于Qt::WindowState的介绍,需要牵涉到QFlag类(这是一个模板类)。QFlags<Enum>是一个模板类,Enum代表enum类型。QFlags是用来通过Qt存储enum联合值的。
QFlag是用来安全存储OR-combination数据的。 标准C++也有用来存储OR-combination数据的方法,通过uint或int存储enum内项的位置即可。但不方便的是,这种方法不可以进行类型检查。任何enum的值都可以存储,而提取的时候也不知道存储的值是不是对应enum的。
Qt使用QFlags来提供类型安全的存储。举例来说,Qt::Alignment类型是给QFlags<Qt::AlignmentFlag>的类型定义。QLabel::setAlignment()取得一个Qt::Alignment类型的值,意味着任何Qt::AlignmentFlag值的联合,或者0,都是合法的参数。
label->setAlignment(Qt::AlignLeft | Qt::AlignTop);
如果你尝试将其他enum的值作为参数或者将白板非0int值作为参数,编译器会报告一个错误。如果你需要将一个int类型转换为flags,你可以使用明确的QFlags类的构造方法作为转换手段。
如果你想要用QFlags来存储自定义enum类型,可以使用Q_DECLARE_FALGS()和Q_DECLARE_OPERATIORS_FOR_FLAGS()宏。
**关于两个宏**
Q_DECLARE_FLAGS(Flags,Enum) == typedef QFlags<Enums> Flags
Q_DECLARE_OPERATORS_FOR_FLAGS(Flags)
源码分析
#define Q_DECLARE_OPERATORS_FOR_FLAGS(Flags) \
Q_DECL_CONSTEXPR inline QFlags<Flags::enum_type> operator|(Flags::enum_type f1, Flags::enum_type f2) Q_DECL_NOTHROW \
\
Q_DECL_CONSTEXPR inline QFlags<Flags::enum_type> operator|(Flags::enum_type f1, QFlags<Flags::enum_type> f2) Q_DECL_NOTHROW \
Q_DECLARE_INCOMPATIBLE_FLAGS(Flags)
class MyClass
{
public:
enum Option {
NoOptions = 0x0,
ShowTabs = 0x1,
ShowAll = 0x2,
SqueezeBlank = 0x4
};
Q_DECLARE_FLAGS(Options, Option)
...
};
Q_DECLARE_OPERATORS_FOR_FLAGS(MyClass::Options)
你可以使用MyClass::Options类型来存储MyClass::Option值的联合。
根据变量名,推断从QGuiApplicationPrivate::platformIntergration()->defaultWindowState(data->window_flags);