窗口场景
标准主窗口场景
若需要包含菜单栏、工具栏、状态栏等标准组件,应继承QMainWindow
若仅作为普通窗口容器,则继承QWidget。
基本容器:QWidget适用于简单界面
完整窗口:QMainWindow适用于需要标准菜单栏的复杂界面
根据实际界面复杂度选择基类类型,若需实现多文档界面(MDI)或标准菜单操作,应优先使用QMainWindow。
| 特性 | QMainWindow | QWidget |
|---|---|---|
| 预置菜单栏支持 | 原生支持 | 需自定义实现 |
| 中央部件区域 | 预留中央Widget区域 | 无特殊区域划分 |
| 停靠窗口支持 | 支持QDockWidget | 不支持 |
| 最小代码量 | 适用于复杂界面 | 适合轻量级窗口 |
QSplitter
QSplitter用于管理子部件的大小,用户可以拖动边界调整。 通过QSplitter实现灵活的区域划分,在保留Dock特性的同时确保获得最大展示空间。
使用QSplitter而非直接使用布局管理器,可实现用户自由调整区域大小,实现可调节分割布局
通过setStretchFactor控制初始比例分配
设置setChildrenCollapsible(false)防止区域被完全关闭
| 参数/方法 | 作用说明 | 对应XML属性 |
|---|---|---|
| QSplitter(Qt::Vertical) | 创建垂直方向分割器容器,子部件上下排列 | orientation=“Vertical” |
| addWidget() | 按添加顺序排列组件(第一个添加的在上方) | widget class属性 |
| setStretchFactor() | 设置伸缩比例,参数1为组件索引,参数2为比例值(建议总和为3或4的倍数) | |
| setObjectName() | 设置组件在XML中的标识符(非必须但建议保持与设计一致) | name属性 |
性能优化措施
地图渲染:采用OpenGL加速的QGraphicsView
数据同步:使用QSharedMemory实现进程间通信
内存管理:对高频更新的设备状态采用对象池模式
对象命名规范:
所有核心组件必须设置唯一的objectName
命名规则:类型_功能,如dock_taskList
窗口管理策略
单例模式:通过static指针确保每个窗口只创建一次
内存管理:设置WA_DeleteOnClose属性保证窗口关闭时自动释放
window->setAttribute(Qt::WA_DeleteOnClose);
窗口激活控制
window->show();
window->raise(); // 置于顶层
window->activateWindow(); // 获取焦点
Dock控件管理策略:
使用QSplitter实现动态分割布局,允许用户调整各区域大小
设置最小宽度限制防止面板过度收缩:setMinimumWidth(300)
内存管理
使用QSharedPointer来管理窗口的资源,QSharedPointer是自动管理内存的,当窗体析构时,如果这些QSharedPointer是最后一个持有该对象的指针,它们会自动删除所指向的对象,不需要手动调用deleteLater。
通常单例的析构由单例自己管理(例如使用静态成员变量,在程序结束时由系统自动回收)。如果单例模式中使用了动态分配且没有自动清理的机制,那需要在析构函数中处理。
析构函数中调用saveWindowState(),是为了在程序退出时保存窗口状态,在closeEvent中已经调用了saveWindowState(),而析构函数是在窗口关闭之后调用的,所以实际上closeEvent已经保存了状态。不过,为了确保在非正常关闭(如直接析构)时也能保存,这样做是安全的。
如果程序通过正常关闭(即用户点击关闭按钮),closeEvent会被调用,然后析构函数再被调用,这样就会保存两次。为了清晰,可以考虑只在closeEvent中保存,而在析构函数中不保存。然而,closeEvent可能不会被调用(例如MainController被直接删除而不是关闭),所以保留析构函数中的保存也是合理的。
1274

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



