<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>QWidget on 李慕然的一天</title><link>https://limuran.top/tags/qwidget/</link><description>Recent content in QWidget on 李慕然的一天</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sat, 29 Aug 2026 19:30:05 +0800</lastBuildDate><atom:link href="https://limuran.top/tags/qwidget/index.xml" rel="self" type="application/rss+xml"/><item><title>Qt show()、raise()、activateWindow() 调用顺序区别</title><link>https://limuran.top/p/qt-showraiseactivatewindow-%E8%B0%83%E7%94%A8%E9%A1%BA%E5%BA%8F%E5%8C%BA%E5%88%AB/</link><pubDate>Sat, 29 Aug 2026 19:30:05 +0800</pubDate><guid>https://limuran.top/p/qt-showraiseactivatewindow-%E8%B0%83%E7%94%A8%E9%A1%BA%E5%BA%8F%E5%8C%BA%E5%88%AB/</guid><description>&lt;img src="https://picsum.photos/1080/800.webp?random=1787976365707" alt="Featured image of post Qt show()、raise()、activateWindow() 调用顺序区别" /&gt;&lt;p&gt;在 Qt 开发中，经常会看到这样的代码：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;raise&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;activateWindow&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;很多人会写，但不一定说得清这三个调用分别在做什么、为什么要按这个顺序调用。&lt;/p&gt;&#10;&lt;p&gt;如果只看现象，很容易把它们理解成“都和把窗口弄到前台有关”。但从 Qt 源码来看，这三个函数负责的是 &lt;strong&gt;三个不同层面&lt;/strong&gt; 的事情：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;show()&lt;/code&gt;：让窗口变成可见&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;raise()&lt;/code&gt;：调整 Z 轴顺序，让窗口尽量到上层&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;activateWindow()&lt;/code&gt;：请求把窗口设为活动窗口，争取键盘焦点&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这三件事并不等价，所以调用顺序也不是随便写的。&lt;/p&gt;&#10;&lt;h2 id="1-show-先让窗口可见"&gt;&lt;a href="#1-show-%e5%85%88%e8%ae%a9%e7%aa%97%e5%8f%a3%e5%8f%af%e8%a7%81" class="header-anchor"&gt;&lt;/a&gt;1. &lt;code&gt;show()&lt;/code&gt; ：先让窗口可见&#10;&lt;/h2&gt;&lt;p&gt;先看 &lt;code&gt;QWidget::show()&lt;/code&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Note: We don&amp;#39;t call showNormal() as not to clobber Qt::Window(Max/Min)imized&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;isWindow&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;setVisible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;platformIntegration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QGuiApplicationPrivate&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;platformIntegration&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Qt&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WindowState&lt;/span&gt; &lt;span class="n"&gt;defaultState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;platformIntegration&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;defaultWindowState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;window_flags&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;defaultState&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;Qt&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WindowFullScreen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;showFullScreen&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nf"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;defaultState&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;Qt&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WindowMaximized&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;showMaximized&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;setVisible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;这里最关键的信息有两个。&lt;/p&gt;&#10;&lt;h3 id="11-show-的本质是-setvisibletrue"&gt;&lt;a href="#11-show-%e7%9a%84%e6%9c%ac%e8%b4%a8%e6%98%af-setvisibletrue" class="header-anchor"&gt;&lt;/a&gt;1.1 &lt;code&gt;show()&lt;/code&gt; 的本质是 &lt;code&gt;setVisible(true)&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;对于普通子控件，&lt;code&gt;show()&lt;/code&gt; 直接就是 &lt;code&gt;setVisible(true)&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;对于顶层窗口，Qt 会先看平台和窗口标志，决定是否默认以：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;全屏 &lt;code&gt;showFullScreen()&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;最大化 &lt;code&gt;showMaximized()&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;普通可见 &lt;code&gt;setVisible(true)&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;所以 &lt;code&gt;show()&lt;/code&gt; 的核心职责只有一个：&lt;strong&gt;让窗口进入可见状态&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;它不负责：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;不负责提升层级&lt;/li&gt;&#10;&lt;li&gt;不负责抢焦点&lt;/li&gt;&#10;&lt;li&gt;不负责把最小化窗口恢复成普通状态&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="12-show-不会主动清掉最小化最大化状态"&gt;&lt;a href="#12-show-%e4%b8%8d%e4%bc%9a%e4%b8%bb%e5%8a%a8%e6%b8%85%e6%8e%89%e6%9c%80%e5%b0%8f%e5%8c%96%e6%9c%80%e5%a4%a7%e5%8c%96%e7%8a%b6%e6%80%81" class="header-anchor"&gt;&lt;/a&gt;1.2 &lt;code&gt;show()&lt;/code&gt; 不会主动清掉最小化/最大化状态&#10;&lt;/h3&gt;&lt;p&gt;源码里这句注释其实非常关键：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Note: We don&amp;#39;t call showNormal() as not to clobber Qt::Window(Max/Min)imized&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;意思是：&lt;code&gt;show()&lt;/code&gt; &lt;strong&gt;不会&lt;/strong&gt;主动调用 &lt;code&gt;showNormal()&lt;/code&gt;，因为 Qt 不想把已有的最大化/最小化状态直接抹掉。&lt;/p&gt;&#10;&lt;p&gt;这意味着：如果一个窗口已经最小化，你再调 &lt;code&gt;show()&lt;/code&gt;，它并不等于“恢复窗口”。这也是为什么很多场景下应该用 &lt;code&gt;showNormal()&lt;/code&gt;，而不是只写 &lt;code&gt;show()&lt;/code&gt;。&lt;/p&gt;&#10;&lt;h2 id="2-shownormal-从最小化最大化全屏恢复"&gt;&lt;a href="#2-shownormal-%e4%bb%8e%e6%9c%80%e5%b0%8f%e5%8c%96%e6%9c%80%e5%a4%a7%e5%8c%96%e5%85%a8%e5%b1%8f%e6%81%a2%e5%a4%8d" class="header-anchor"&gt;&lt;/a&gt;2. &lt;code&gt;showNormal()&lt;/code&gt; ：从最小化/最大化/全屏恢复&#10;&lt;/h2&gt;&lt;p&gt;再看 &lt;code&gt;QWidget::showNormal()&lt;/code&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;span class="lnt"&gt;7&#10;&lt;/span&gt;&lt;span class="lnt"&gt;8&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;showNormal&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ensurePolished&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;setWindowState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;windowState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Qt&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WindowMinimized&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Qt&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WindowMaximized&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Qt&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WindowFullScreen&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;setVisible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;它做了两步：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;清掉这几个状态位：&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;Qt::WindowMinimized&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Qt::WindowMaximized&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Qt::WindowFullScreen&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;再 &lt;code&gt;setVisible(true)&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;所以 &lt;code&gt;showNormal()&lt;/code&gt; 的语义非常明确：&lt;strong&gt;把窗口恢复到普通状态并显示出来&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;这就是为什么下面这种场景，&lt;code&gt;showNormal()&lt;/code&gt; 比 &lt;code&gt;show()&lt;/code&gt; 更合适：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;主窗口被最小化到了任务栏&lt;/li&gt;&#10;&lt;li&gt;单例程序二次启动时，需要把已有窗口恢复出来&lt;/li&gt;&#10;&lt;li&gt;点击托盘图标时，希望把隐藏/最小化窗口重新拉回桌面&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;换句话说：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;show()&lt;/code&gt; 解决的是“看不看得见”&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;showNormal()&lt;/code&gt; 解决的是“是不是还卡在最小化/最大化/全屏状态里”&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="3-raise-调整堆叠顺序不等于激活窗口"&gt;&lt;a href="#3-raise-%e8%b0%83%e6%95%b4%e5%a0%86%e5%8f%a0%e9%a1%ba%e5%ba%8f%e4%b8%8d%e7%ad%89%e4%ba%8e%e6%bf%80%e6%b4%bb%e7%aa%97%e5%8f%a3" class="header-anchor"&gt;&lt;/a&gt;3. &lt;code&gt;raise()&lt;/code&gt; ：调整堆叠顺序，不等于激活窗口&#10;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;QWidget::raise()&lt;/code&gt; 源码如下：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;span class="lnt"&gt;21&#10;&lt;/span&gt;&lt;span class="lnt"&gt;22&#10;&lt;/span&gt;&lt;span class="lnt"&gt;23&#10;&lt;/span&gt;&lt;span class="lnt"&gt;24&#10;&lt;/span&gt;&lt;span class="lnt"&gt;25&#10;&lt;/span&gt;&lt;span class="lnt"&gt;26&#10;&lt;/span&gt;&lt;span class="lnt"&gt;27&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;raise&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Q_D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;isWindow&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parentWidget&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;parentChildCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;d_func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parentChildCount&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;d_func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Q_ASSERT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;parentChildCount&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;d_func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parentChildCount&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;testAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Qt&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WA_WState_Created&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;testAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Qt&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WA_WState_Created&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nf"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;parentChildCount&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;QRegion&lt;/span&gt; &lt;span class="nf"&gt;region&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;subtractOpaqueSiblings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;invalidateBackingStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;testAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Qt&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WA_WState_Created&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;raise_sys&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;extra&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;extra&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;hasWindowContainer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;QWindowContainer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;parentWasRaised&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;QEvent&lt;/span&gt; &lt;span class="nf"&gt;e&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;QEvent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ZOrderChange&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;QCoreApplication&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sendEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;这个函数要分成 &lt;strong&gt;子控件&lt;/strong&gt; 和 &lt;strong&gt;顶层窗口&lt;/strong&gt; 两部分来看。&lt;/p&gt;&#10;&lt;h3 id="31-对子控件来说raise-主要是在父对象的-children-列表里挪位置"&gt;&lt;a href="#31-%e5%af%b9%e5%ad%90%e6%8e%a7%e4%bb%b6%e6%9d%a5%e8%af%b4raise-%e4%b8%bb%e8%a6%81%e6%98%af%e5%9c%a8%e7%88%b6%e5%af%b9%e8%b1%a1%e7%9a%84-children-%e5%88%97%e8%a1%a8%e9%87%8c%e6%8c%aa%e4%bd%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;3.1 对子控件来说，&lt;code&gt;raise()&lt;/code&gt; 主要是在父对象的 children 列表里挪位置&#10;&lt;/h3&gt;&lt;p&gt;这一段最说明问题：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;parentChildCount&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;d_func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parentChildCount&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;也就是说，对于非窗口控件，&lt;code&gt;raise()&lt;/code&gt; 首先会把当前控件移动到父控件 &lt;code&gt;children&lt;/code&gt; 列表的最后面，从而改变绘制和堆叠顺序。&lt;/p&gt;&#10;&lt;p&gt;后面又会：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;必要时 &lt;code&gt;create()&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;重新计算区域&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;invalidateBackingStore(region)&lt;/code&gt; 触发重绘&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;所以对子控件来说，&lt;code&gt;raise()&lt;/code&gt; 的核心含义是：&lt;strong&gt;把我放到兄弟控件的最上层&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h3 id="32-对顶层窗口来说真正关键的是-d-raise_sys"&gt;&lt;a href="#32-%e5%af%b9%e9%a1%b6%e5%b1%82%e7%aa%97%e5%8f%a3%e6%9d%a5%e8%af%b4%e7%9c%9f%e6%ad%a3%e5%85%b3%e9%94%ae%e7%9a%84%e6%98%af-d-raise_sys" class="header-anchor"&gt;&lt;/a&gt;3.2 对顶层窗口来说，真正关键的是 &lt;code&gt;d-&amp;gt;raise_sys()&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;对于顶层窗口，关键是这句：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;testAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Qt&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WA_WState_Created&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;raise_sys&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;这说明两件事：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;raise()&lt;/code&gt; 最终要落到平台层，也就是请求窗口系统提升窗口层级&lt;/li&gt;&#10;&lt;li&gt;前提是窗口已经创建，也就是 &lt;code&gt;Qt::WA_WState_Created&lt;/code&gt; 为真&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;这就是一个非常容易忽略的点：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;如果顶层窗口还没有创建，单独调用 &lt;code&gt;raise()&lt;/code&gt; 可能什么都不会发生。&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;而顶层窗口通常是在 &lt;code&gt;show()&lt;/code&gt; / &lt;code&gt;setVisible(true)&lt;/code&gt; 之后才真正进入“已创建”状态。因此从源码角度看，&lt;strong&gt;先 &lt;code&gt;show()&lt;/code&gt; 再 &lt;code&gt;raise()&lt;/code&gt;&lt;/strong&gt; 是合理的。&lt;/p&gt;&#10;&lt;h3 id="33-raise-不等于获得焦点"&gt;&lt;a href="#33-raise-%e4%b8%8d%e7%ad%89%e4%ba%8e%e8%8e%b7%e5%be%97%e7%84%a6%e7%82%b9" class="header-anchor"&gt;&lt;/a&gt;3.3 &lt;code&gt;raise()&lt;/code&gt; 不等于“获得焦点”&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;raise()&lt;/code&gt; 做的是层级调整，不是焦点激活。&lt;/p&gt;&#10;&lt;p&gt;即使窗口已经被放到上层，也不代表它已经成为活动窗口，更不代表它已经拿到键盘输入焦点。&lt;/p&gt;&#10;&lt;p&gt;所以只写：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;raise&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;只能表达“请把这个窗口提到前面一点”，不能表达“让用户马上输入”。&lt;/p&gt;&#10;&lt;h2 id="4-activatewindow-请求激活顶层窗口"&gt;&lt;a href="#4-activatewindow-%e8%af%b7%e6%b1%82%e6%bf%80%e6%b4%bb%e9%a1%b6%e5%b1%82%e7%aa%97%e5%8f%a3" class="header-anchor"&gt;&lt;/a&gt;4. &lt;code&gt;activateWindow()&lt;/code&gt; ：请求激活顶层窗口&#10;&lt;/h2&gt;&lt;p&gt;再看 &lt;code&gt;QWidget::activateWindow()&lt;/code&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;QWidget&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;activateWindow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;QWindow&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;wnd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;windowHandle&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wnd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;wnd&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;requestActivate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="41-它操作的不是当前控件本身而是它所属的顶层窗口"&gt;&lt;a href="#41-%e5%ae%83%e6%93%8d%e4%bd%9c%e7%9a%84%e4%b8%8d%e6%98%af%e5%bd%93%e5%89%8d%e6%8e%a7%e4%bb%b6%e6%9c%ac%e8%ba%ab%e8%80%8c%e6%98%af%e5%ae%83%e6%89%80%e5%b1%9e%e7%9a%84%e9%a1%b6%e5%b1%82%e7%aa%97%e5%8f%a3" class="header-anchor"&gt;&lt;/a&gt;4.1 它操作的不是当前控件本身，而是它所属的顶层窗口&#10;&lt;/h3&gt;&lt;p&gt;源码里写的是：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;windowHandle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;也就是说，即使你在一个子控件上调用 &lt;code&gt;activateWindow()&lt;/code&gt;，最后激活的也不是这个子控件，而是 &lt;strong&gt;包含它的顶层窗口&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;所以 &lt;code&gt;activateWindow()&lt;/code&gt; 的语义并不是“让这个 widget 获得焦点”，而是：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;让这个 widget 所在的顶层窗口成为活动窗口。&lt;/strong&gt;&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="42-它只是调用-requestactivate不是强制激活"&gt;&lt;a href="#42-%e5%ae%83%e5%8f%aa%e6%98%af%e8%b0%83%e7%94%a8-requestactivate%e4%b8%8d%e6%98%af%e5%bc%ba%e5%88%b6%e6%bf%80%e6%b4%bb" class="header-anchor"&gt;&lt;/a&gt;4.2 它只是调用 &lt;code&gt;requestActivate()&lt;/code&gt;，不是强制激活&#10;&lt;/h3&gt;&lt;p&gt;源码最后只是：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;wnd&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;requestActivate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;注意这个名字叫 &lt;code&gt;requestActivate()&lt;/code&gt;，不是 &lt;code&gt;forceActivate()&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;也就是说，Qt 能做的是向底层窗口系统发起“激活请求”，至于系统是否接受，要看平台策略。&lt;/p&gt;&#10;&lt;p&gt;Qt 自己的注释已经说得很清楚：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;在 X11 上，结果依赖 Window Manager&lt;/li&gt;&#10;&lt;li&gt;如果希望窗口也被堆叠到上面，应该额外调用 &lt;code&gt;raise()&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;窗口必须是可见的，否则 &lt;code&gt;activateWindow()&lt;/code&gt; 没有效果&lt;/li&gt;&#10;&lt;li&gt;在 Windows 上，如果当前应用不是活动应用，系统通常不会允许你直接抢走前台焦点，只会在任务栏上提示用户&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这也解释了为什么很多人觉得 &lt;code&gt;activateWindow()&lt;/code&gt; “有时有效，有时无效”。&lt;/p&gt;&#10;&lt;p&gt;不是 Qt 不执行，而是 Qt 只能请求，&lt;strong&gt;不能绕过操作系统的前台窗口策略&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h2 id="5-为什么推荐顺序是-shownormal--show--raise--activatewindow"&gt;&lt;a href="#5-%e4%b8%ba%e4%bb%80%e4%b9%88%e6%8e%a8%e8%8d%90%e9%a1%ba%e5%ba%8f%e6%98%af-shownormal--show--raise--activatewindow" class="header-anchor"&gt;&lt;/a&gt;5. 为什么推荐顺序是 &lt;code&gt;showNormal()&lt;/code&gt; / &lt;code&gt;show()&lt;/code&gt; → &lt;code&gt;raise()&lt;/code&gt; → &lt;code&gt;activateWindow()&lt;/code&gt;&#10;&lt;/h2&gt;&lt;p&gt;从上面的源码可以直接推导出推荐顺序。&lt;/p&gt;&#10;&lt;h3 id="51-第一步先让窗口可见"&gt;&lt;a href="#51-%e7%ac%ac%e4%b8%80%e6%ad%a5%e5%85%88%e8%ae%a9%e7%aa%97%e5%8f%a3%e5%8f%af%e8%a7%81" class="header-anchor"&gt;&lt;/a&gt;5.1 第一步先让窗口可见&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;activateWindow()&lt;/code&gt; 的注释里已经明确写了：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;the window must be visible, otherwise activateWindow() has no effect.&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;同时 &lt;code&gt;activateWindow()&lt;/code&gt; 内部还依赖：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;windowHandle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;如果窗口还没显示，&lt;code&gt;windowHandle()&lt;/code&gt; 很可能还没准备好，调用就直接空转。&lt;/p&gt;&#10;&lt;p&gt;所以必须先 &lt;code&gt;show()&lt;/code&gt; 或 &lt;code&gt;showNormal()&lt;/code&gt;。&lt;/p&gt;&#10;&lt;h3 id="52-第二步再调整层级"&gt;&lt;a href="#52-%e7%ac%ac%e4%ba%8c%e6%ad%a5%e5%86%8d%e8%b0%83%e6%95%b4%e5%b1%82%e7%ba%a7" class="header-anchor"&gt;&lt;/a&gt;5.2 第二步再调整层级&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;raise()&lt;/code&gt; 的职责是把窗口提到更上层。&lt;/p&gt;&#10;&lt;p&gt;Qt 注释里对 &lt;code&gt;activateWindow()&lt;/code&gt; 也专门说了：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;If you want to ensure that the window is stacked on top as well you should also call raise().&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;也就是说，&lt;strong&gt;激活&lt;/strong&gt; 和 &lt;strong&gt;置顶到当前堆叠前面&lt;/strong&gt; 是两件事。&lt;/p&gt;&#10;&lt;p&gt;如果你只调用 &lt;code&gt;activateWindow()&lt;/code&gt;，某些平台上未必会自动帮你把窗口提到你想要的位置；而 &lt;code&gt;raise()&lt;/code&gt; 就是在补这个动作。&lt;/p&gt;&#10;&lt;h3 id="53-第三步再请求激活"&gt;&lt;a href="#53-%e7%ac%ac%e4%b8%89%e6%ad%a5%e5%86%8d%e8%af%b7%e6%b1%82%e6%bf%80%e6%b4%bb" class="header-anchor"&gt;&lt;/a&gt;5.3 第三步再请求激活&#10;&lt;/h3&gt;&lt;p&gt;等窗口已经：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;处于可见状态&lt;/li&gt;&#10;&lt;li&gt;层级也尽量被抬上来&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;再调用 &lt;code&gt;activateWindow()&lt;/code&gt; 去请求焦点，语义最完整。&lt;/p&gt;&#10;&lt;p&gt;所以推荐顺序是：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;raise&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;activateWindow&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;如果窗口可能处于最小化状态，则更推荐：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;showNormal&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;raise&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;activateWindow&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="6-总结"&gt;&lt;a href="#6-%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;6. 总结&#10;&lt;/h2&gt;&lt;p&gt;从 Qt 源码看，这几个 API 的职责边界非常清楚：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;show()&lt;/code&gt;：让窗口可见，但不负责恢复普通状态，也不负责焦点&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;showNormal()&lt;/code&gt;：清掉最小化/最大化/全屏状态，再显示&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;raise()&lt;/code&gt;：调整 Z 轴顺序，尽量把窗口放到更上层&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;activateWindow()&lt;/code&gt;：向窗口系统请求激活顶层窗口&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;因此：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;想恢复最小化窗口：&lt;code&gt;showNormal()&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;想把窗口提到前面：&lt;code&gt;raise()&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;想请求焦点：&lt;code&gt;activateWindow()&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;想完整表达“显示并尽量切到前台”：&lt;code&gt;showNormal()&lt;/code&gt; / &lt;code&gt;show()&lt;/code&gt; + &lt;code&gt;raise()&lt;/code&gt; + &lt;code&gt;activateWindow()&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;最常用、也最符合源码语义的调用顺序就是：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;showNormal&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;raise&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;activateWindow&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;如果窗口本来不是最小化状态，再把 &lt;code&gt;showNormal()&lt;/code&gt; 换成 &lt;code&gt;show()&lt;/code&gt; 即可。&lt;/p&gt;&#10;</description></item></channel></rss>