parent
16b94db7b7
commit
c6a8410827
|
@ -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() 的时候都不会删除旧的菜单栏,因此下次使用的时候也就不需要再重新分配了。参考代码如下:
|
||||
|
||||
|
|
Loading…
Reference in New Issue