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、运行测试

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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐