本次分析是通过源代码来搞清楚以下的Qt窗口特性,以下特性是通过测试得到的:
1) 新弹出的全屏窗口(指使用了QWidget::showFullScreen方法显示的窗口)能覆盖已经存在的全屏窗口,以及所有其它窗口(包括带WStyle_StaysOnTop属性的窗口)
2)当一个全屏窗口正在显示,而这时如果有其它的窗口被激活(调用QWidget::setActiveWindow)时,这个全屏窗口会被隐藏,一个有窗口的应用程序被启动时,因为它的主窗口会被激活,因此也会隐藏掉正在显示的全屏窗口
3)一个带WStyle_StaysOnTop窗口弹出时,会覆盖掉其它带WStyle_StaysOnTop属性的窗口和不带WStyle_StaysOnTop属性的窗口,但不能覆盖全屏窗口(指使用了QWidget::showFullScreen方法显示的窗口)
----------------------------------------------------------------------------------------------------------------------
函数中会设置fullscreen=1, 并调用raise();
{
if ( !isTopLevel() )
return;
topData()->fullscreen = 1;
resize( qApp->desktop()->size() );
raise();
show();
setActiveWindow();
}
{
int al = topData()->fullscreen ? 2 :
testWFlags(WStyle_StaysOnTop) ? 1 : 0;
qwsDisplay()->setAltitude( winId(), al, TRUE);
{
if ( changingw->d->altitude == 2 ) {
windows.prepend( changingw ); //QList::prepend函数是将节点插入到列表的最前面
} else {
// insert after "stays on top" windows
bool in = FALSE;
w = windows.first();
while ( w ) {
if ( (changingw->onTop && w->d->altitude != 2 ) || !w->onTop ) {
windows.insert( windows.at(), changingw );
in = TRUE;
break;
}
w = windows.next();
}
if ( !in )
windows.append( changingw );
}
if ( ((QWSFocusEvent*)event)->simpleData.get_focus ) {
...
} else { //窗口失去了焦点的分支
return TRUE; // not interesting
if (widget->topData()->fullscreen) { //如果是全屏窗口失去焦点,则做一些手脚
bool endFullScreen = TRUE;
if ( widget->children() ) {
...
}
if (endFullScreen)
widget->hide(); //全屏窗口在这里被隐藏
本文分析了Qt中全屏窗口的显示优先级及其隐藏机制。全屏窗口能覆盖所有其他窗口,包括置顶窗口,并详细解释了这一特性的实现原理。
882

被折叠的 条评论
为什么被折叠?



