QT肝8天15--左侧静态菜单
1、Qt 菜单导航实现方法
方法一:使用 QMenuBar 和 QMenu
在 Qt 中,可以通过 QMenuBar 和 QMenu 类创建菜单导航。QMenuBar 通常作为主窗口的顶部菜单栏,而 QMenu 用于添加具体的菜单项。
方法二:使用 Qt Designer 设计菜单
在 Qt Designer 中,可以直接拖拽 Menu Bar 组件到主窗口,然后通过右键添加菜单和动作。这种方法更直观,适合快速原型开发。
- 在 Qt Designer 中打开主窗口
- 从左侧组件列表拖拽 Menu Bar 到窗口顶部
- 双击菜单栏输入菜单名称
- 右键点击菜单添加动作
方法三:上下文菜单实现
除了主菜单栏,还可以实现上下文菜单(右键菜单):
方法四:动态菜单更新
菜单项可以根据程序状态动态更新
方法五:菜单快捷键和图标
为菜单项添加快捷键和图标:
方法六:多级子菜单
创建多级菜单结构:
注意事项
- 保持菜单结构清晰,避免嵌套过深
- 为常用功能添加快捷键
- 考虑跨平台一致性
- 对于禁用状态的功能,相应菜单项也应禁用
- 大型应用建议使用 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、运行测试
原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,请动动你的金手指,祝您早日实现财务自由。