Qt中的topLevelWidgets()到底是哪些widgets?

先看QT文档对topLevelWidgets()的描述:

[static] QWidgetList QApplication::topLevelWidgets()
Returns a list of the top-level widgets (windows) in the application.
Note: Some of the top-level widgets may be hidden, for example a tooltip if no tooltip is currently shown.
Example:

  void showAllHiddenTopLevelWidgets()
  {
      foreach (QWidget *widget, QApplication::topLevelWidgets()) {
          if (widget->isHidden())
              widget->show();
      }
  }

See also allWidgets(), QWidget::isWindow(), and QWidget::isHidden().

该方法返回应用程序中所有的top-level控件(窗口).

那么,究竟哪些控件才是top-level控件?

看代码:

QWidgetList QApplication::topLevelWidgets()
{
    QWidgetList list;
    QWidgetList all = allWidgets();

    for (QWidgetList::ConstIterator it = all.constBegin(), cend = all.constEnd(); it != cend; ++it) {
        QWidget *w = *it;
        if (w->isWindow() && w->windowType() != Qt::Desktop)
            list.append(w);
    }
    return list;
}

typedef QSet<QWidget *> QWidgetSet;
static QWidgetSet *allWidgets;
QWidgetList QApplication::allWidgets()
{
    if (QWidgetPrivate::allWidgets)
        return QWidgetPrivate::allWidgets->toList();
    return QWidgetList();
}

显然,所谓的top-level控件,返回的就是类QWidgetPrivate的静态成员变量allWidgets中那些 “有自己的窗口而且不是桌面窗口" 的控件。

静态成员变量allWidgets里面又有哪些控件?看QWidget的构造函数:

QWidget::QWidget(QWidget *parent, Qt::WindowFlags f)
    : QObject(*new QWidgetPrivate, 0), QPaintDevice()
{
    QT_TRY {
        d_func()->init(parent, f);
    } QT_CATCH(...) {
        QWidgetExceptionCleaner::cleanup(this, d_func());
        QT_RETHROW;
    }
}

每一个QWidget的构造都会创建一个QWidgetPrivate对象,然后调用QWidgetPrivate的init()方法:


void QWidgetPrivate::init(QWidget *parentWidget, Qt::WindowFlags f)
{
    Q_Q(QWidget);
    if (Q_UNLIKELY(!qobject_cast<QApplication *>(QCoreApplication::instance())))
        qFatal("QWidget: Cannot create a QWidget without QApplication");

    Q_ASSERT(allWidgets);
    if (allWidgets)
        allWidgets->insert(q);
        
    .......
}

QWidgetPrivate直接把绑定的QWidget对象(通过Q_Q(QWidget)获取)插入到了allWidgets中。

所以,分析结果就是:

任何QWidget在创建后都会放到allWidgets,而QApplication::topLevelWidgets()返回的就是除了桌面以外所有带窗口的QWidget!!!!

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值