From c6a841082763f22694909f47c8fc6c91d6f9dbed Mon Sep 17 00:00:00 2001 From: "ithink.chan" Date: Mon, 18 Nov 2019 17:48:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E8=AF=AD=E5=8F=A5=E6=9B=B4=E9=80=9A?= =?UTF-8?q?=E9=A1=BA.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: ithink.chan --- .../Qt/Qt_Libs/QMenuBar/QMainWindow_动态切换菜单栏.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Software/Development/Environment/Qt/Qt_Libs/QMenuBar/QMainWindow_动态切换菜单栏.md b/Software/Development/Environment/Qt/Qt_Libs/QMenuBar/QMainWindow_动态切换菜单栏.md index 254761c..62931c5 100644 --- a/Software/Development/Environment/Qt/Qt_Libs/QMenuBar/QMainWindow_动态切换菜单栏.md +++ b/Software/Development/Environment/Qt/Qt_Libs/QMenuBar/QMainWindow_动态切换菜单栏.md @@ -1,8 +1,8 @@ -# QMainWindow_动态切换菜单栏 +# QMainWindow 动态切换菜单栏 因为种种原因,需要根据情况动态切换菜单栏。可以手动编码,也可以使用 UI 类。使用 UI 类来实现的话更清晰些,每个菜单的功能代码写到各自的文件里,主界面只负责切换就行,非常简洁。 -没时间,就贴代码吧,不上图了,脑补一下吧。示例工程树如下: +没时间,就只贴代码,不上图了,脑补一下吧。示例工程树如下: * Demo.pro * main.cpp @@ -63,7 +63,7 @@ void MainWindow::on_pushButtonB_clicked() ## 高级篇 -上面每次切换菜单都会自动删除上次菜单栏对象,然后再新分配一个。但是有的项目需要这些对象从一开始就分配出来,并且不再被释放。例如菜单有各自的状态,在不同状态下某些项目是禁能的,如果每次重新创建,就需要在其他地方记录状态,这使代码变得复杂。有没有办法不进行重新分配呢?这样每个菜单栏自己就可以记录状态。 +上面每次切换菜单都会自动删除上次菜单栏对象,然后再重新分配一个。但是有的项目需要这些对象从一开始就分配出来,并且不再被释放。例如菜单有各自的状态,在不同状态下某些项目是禁能的,如果每次重新创建,就需要在其他地方记录状态,这使代码变得复杂。有没有办法不进行重新分配呢?这样每个菜单栏自己就可以记录状态。 通过分析 setMenuBar 方法,发现其会调用 oldMenuBar->deleteLater() 方法释放旧的菜单栏对象。而 deleteLater() 主要是给自己发送 DeferredDelete 事件,然后在事件循环中释放自己。因此我们可以重写 MenuA 和 MenuB 的 event() 方法,来拒绝删除操作,这样每次 setMenuBar() 的时候都不会删除旧的菜单栏,因此下次使用的时候也就不需要再重新分配了。参考代码如下: