Qt show背后发生的一些事
分析
一个窗口要在操作系统中显示出来,必然要调用操作系统提供的接口。例如在window平台上编写界面程序时,程序员需要设计窗口类,向操作系统注册窗口类,创建窗口句柄,显示窗口1
show并没有做什么:
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()?
}
真正创建窗口句柄的任务在setVisible中被调用:
void QWidget::setVisible(bool visible)
{
if (visible) { // show
if (testAttribute(Qt::WA_WState_ExplicitShowHide) &&
!testAttribute(Qt::WA_WState_Hidden))
return;
Q_D(QWidget);
/*
如果该widget的句柄还未被创建,且该窗口是一个独立窗口或者是父窗口
已经创建了窗口句柄的一个非独立窗口,那么就创建一个窗口句柄(对应win32的实现为
注册窗口类和回调过程,创建窗口)。
*/
//create toplevels but not children of non-visible parents