从show()函数入口,观察QWidget的绘制过程

本文深入分析了Qt中`QWidget`的显示过程,从`show()`函数开始,探讨了`Qt::WindowState`如何影响窗口状态,提到了`QGuiApplicationPrivate`在其中的作用,并详细介绍了`showFullScreen()`和`showMaximized()`等方法。虽然源码理解困难,作者建议将重点放在Qt的使用学习上。
摘要由CSDN通过智能技术生成
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); // FIXME: Why not showNormal(), like QWindow::show()?
}

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 \
{ return QFlags<Flags::enum_type>(f1) | f2; } \
Q_DECL_CONSTEXPR inline QFlags<Flags::enum_type> operator|(Flags::enum_type f1, QFlags<Flags::enum_type> f2) Q_DECL_NOTHROW \
{ return f2 | f1; } 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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值