当前位置: 首页 > news >正文

QT肝8天15--左侧静态菜单

1、Qt 菜单导航实现方法

方法一:使用 QMenuBar 和 QMenu

在 Qt 中,可以通过 QMenuBar 和 QMenu 类创建菜单导航。QMenuBar 通常作为主窗口的顶部菜单栏,而 QMenu 用于添加具体的菜单项。

方法二:使用 Qt Designer 设计菜单

在 Qt Designer 中,可以直接拖拽 Menu Bar 组件到主窗口,然后通过右键添加菜单和动作。这种方法更直观,适合快速原型开发。

  1. 在 Qt Designer 中打开主窗口
  2. 从左侧组件列表拖拽 Menu Bar 到窗口顶部
  3. 双击菜单栏输入菜单名称
  4. 右键点击菜单添加动作

方法三:上下文菜单实现

除了主菜单栏,还可以实现上下文菜单(右键菜单):

方法四:动态菜单更新

菜单项可以根据程序状态动态更新

方法五:菜单快捷键和图标

为菜单项添加快捷键和图标:

方法六:多级子菜单

创建多级菜单结构:

注意事项

  • 保持菜单结构清晰,避免嵌套过深
  • 为常用功能添加快捷键
  • 考虑跨平台一致性
  • 对于禁用状态的功能,相应菜单项也应禁用
  • 大型应用建议使用 QActionGroup 管理相关动作

2、TreeWiget控件介绍 

QT 中的 QTreeWidget 是一个用于显示树形结构数据的控件,继承自 QTreeView,提供了更简单的接口来操作树形数据。它适合展示层级关系明确的内容,如文件目录、分类菜单等。

常用信号包括:

  • itemClicked(QTreeWidgetItem *item, int column):点击节点时触发。
  • itemDoubleClicked(QTreeWidgetItem *item, int column):双击节点时触发。

常用操作

展开或折叠所有节点

性能优化

对于大量数据,建议使用 QTreeView 搭配模型(如 QFileSystemModel 或自定义模型)。QTreeWidget 适合数据量较小的场景,因其直接操作内存中的节点。

3、阿迪达斯,牛马行动

1、修改主界面UI

2、实现槽函数 

3、静态左侧菜单

QTreeWidgetItem介绍

QTreeWidgetItem 是 Qt 框架中用于在 QTreeWidget 中显示树形结构数据的类。每个 QTreeWidgetItem 可以包含文本、图标、复选框等子项,并支持嵌套子节点。创建 QTreeWidgetItem 并添加到 QTreeWidget 中,QTreeWidgetItem 本身不直接提供信号,但可以通过 QTreeWidget 的信号(如 itemClicked)处理交互:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QFile>
#include <subwin/customerform.h>
#include <subwin/orderform.h>
#include <subwin/peoplewin.h>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);initUI();//初始化UI//initPeopleList();//初始化列表initMenuTreeList();
}MainWindow::~MainWindow()
{delete ui;
}//初始化样式
void MainWindow::initUI()
{// 设置图标this->setWindowIcon(QIcon(":/img/zhaoxi.png"));// 布局Qt::WindowFlags flags = this->windowFlags();flags |= Qt::FramelessWindowHint;       // //隐藏标题栏flags &= ~Qt::WindowMinMaxButtonsHint;  // 隐藏最小最大化按钮flags &= ~Qt::WindowCloseButtonHint;    // 隐藏关闭按钮this->setWindowFlags(flags);// 读取样式表QFile file(":/uistyle.css");if (file.open(QFile::ReadOnly)) {QString qss = QLatin1String(file.readAll());file.close();// 让读取的样式生效this->setStyleSheet(qss);}//禁用左侧dockwidget状态QWidget *w=new QWidget();if(w){ui->dockWidget_2->setTitleBarWidget(w);}}//初始化列表
void MainWindow::initPeopleList()
{PeopleWin *w=new PeopleWin();if(w==nullptr){return;}if(ui->rightcontentwidget->layout()==nullptr){qDebug()<<"没有布局";}clearContainer(ui->rightcontentwidget);//清空布局内容//重新创建布局进行填充QGridLayout *layout=new QGridLayout(ui->rightcontentwidget);if(layout==nullptr){return;}layout->setSpacing(0);layout->addWidget(w);//将人员列表窗体添加到布局中ui->rightbuttonwidget->setSizePolicy(QSizePolicy::Policy::Expanding,QSizePolicy::Policy::Expanding);//设置策略ui->rightbuttonwidget->setLayout(layout);//将布局添加到区域中
}//清除内容区
void MainWindow::clearContainer(QWidget *container)
{if(container){QLayoutItem *child=nullptr;QLayout *lay=ui->rightcontentwidget->layout();//获取内容区域的布局if(lay){while((child=lay->takeAt(0))!=0){QWidget *w=child->widget();if(w){w->setParent(NULL);w->deleteLater();}delete child;}delete lay;container->setLayout(nullptr);}}
}//关闭窗体
void MainWindow::on_closeToolButton_clicked()
{int ret=QMessageBox::question(this,"关闭系统运行","您确定要退出系统吗?","确认","取消");if(ret==0){this->close();}
}//最大化窗体
void MainWindow::on_maxToolButton_clicked()
{this->showFullScreen();  // 全屏展示
}//最小化窗体
void MainWindow::on_minToolButton_clicked()
{this->showMinimized();
}//选择不同的菜单后触发的事件
void MainWindow::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
{if(current==nullptr){return;}//获取点击的菜单名称QString name=current->text(0);//获取名称if(name=="用户管理"){initPeopleList();//初始化列表}else if(name=="客户管理"){initCustomerList();}else if(name=="订单管理"){initOrderList();}
}//初始化客户窗体
void MainWindow::initCustomerList()
{CustomerForm *w=new CustomerForm();if(w==nullptr){return;}if(ui->rightcontentwidget->layout()==nullptr){qDebug()<<"没有布局";}clearContainer(ui->rightcontentwidget);//清空布局内容//重新创建布局进行填充QGridLayout *layout=new QGridLayout(ui->rightcontentwidget);if(layout==nullptr){return;}layout->setSpacing(0);layout->addWidget(w);//将窗体添加到布局中ui->rightbuttonwidget->setSizePolicy(QSizePolicy::Policy::Expanding,QSizePolicy::Policy::Expanding);//设置策略ui->rightbuttonwidget->setLayout(layout);//将布局添加到区域中
}
//初始化客户窗体
void MainWindow::initOrderList()
{OrderForm *w=new OrderForm();if(w==nullptr){return;}if(ui->rightcontentwidget->layout()==nullptr){qDebug()<<"没有布局";}clearContainer(ui->rightcontentwidget);//清空布局内容//重新创建布局进行填充QGridLayout *layout=new QGridLayout(ui->rightcontentwidget);if(layout==nullptr){return;}layout->setSpacing(0);layout->addWidget(w);//将窗体添加到布局中ui->rightbuttonwidget->setSizePolicy(QSizePolicy::Policy::Expanding,QSizePolicy::Policy::Expanding);//设置策略ui->rightbuttonwidget->setLayout(layout);//将布局添加到区域中
}//初始化左侧菜单
void MainWindow::initMenuTreeList()
{//创建根菜单QStringList rootdata = {"系统管理", "001"};QTreeWidgetItem *rootItem = new QTreeWidgetItem(ui->treeWidget, rootdata);rootItem->setIcon(0, QIcon(":/img/sum.png"));//创建子菜单QStringList child1Data1 = {"用户管理", "001"};QTreeWidgetItem *child1Item = new QTreeWidgetItem(rootItem, child1Data1);child1Item->setIcon(0, QIcon(":/img/sum.png"));QStringList rootdata2 = {"客户管理", "002"};QTreeWidgetItem *rootItem2 = new QTreeWidgetItem(ui->treeWidget, rootdata2);rootItem2->setIcon(0, QIcon(":/img/info.png"));QStringList rootdata3 = {"订单管理", "003"};QTreeWidgetItem *rootItem3 = new QTreeWidgetItem(ui->treeWidget, rootdata3);rootItem3->setIcon(0, QIcon(":/img/alarm.png"));ui->treeWidget->setHeaderHidden(true);ui->treeWidget->setFocusPolicy(Qt::ClickFocus);
}

4、运行测试

原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,请动动你的金手指,祝您早日实现财务自由。

http://www.dtcms.com/a/438065.html

相关文章:

  • 开源安全工具推荐:afrog- 主要用于 Bug Bounty、Pentest 和 Red Teaming 的安全工具
  • Go中的字符串
  • 为什么要做外贸网站公司邮箱域名是什么
  • 《政企API网关:安全与性能平衡的转型实践》
  • 安卓基础组件026-TabLayout
  • Day03_刷题niuke20251004
  • LeetCode:88.乘积最大子数组
  • 7.Java线程中的重要方法(interrupt、isInterrupted、interrupted)
  • 【深度学习计算机视觉】09:语义分割和数据集
  • Vue3 + Three.js 实现 3D 汽车个性化定制及展示
  • 外贸网站 费用广告公司取名字
  • 金融分析师技能提升路径与学习资源指南
  • MySQL processes, threads, connections的区别
  • 自己做的网站首页变成符号了工程与建设
  • P6374 「StOI-1」树上询问(倍增+LCA)
  • epoll_ctl函数中`sockfd` 和 `ev.data.fd`的疑问解析
  • 做元器件上什么网站做网站公司的排名
  • hadoop-hdfs-secondaryNameNode
  • 每日一个网络知识点:OSI参考模型
  • 怎么在国外网站做推广wordpress企业主题制作视频教程
  • K8s不同工作负载对应LOL里哪位英雄
  • 【探寻C++之旅】第十六章:unordered系列的认识与模拟实现
  • 用terraform 创建一个GKE private cluster
  • [优选算法专题三.二分查找——NO.22寻找峰值]
  • 中国建设银行官方网站下载北京企业做网站
  • [优选算法专题三.二分查找——NO.24搜索旋转排序数组中的最⼩值]
  • 微服务项目->在线oj系统(Java-Spring)--竞赛管理
  • 苏州市吴江太湖新城建设局网站网站模版建设教程
  • 【AI Design】如何利用 Paraflow 从创意到产品设计规范
  • 360免费建站网址是什么深圳网站推广哪家好