Qt 中的多级子菜单

Posted

技术标签:

【中文标题】Qt 中的多级子菜单【英文标题】:Multiple Levels submenus in Qt 【发布时间】:2019-04-09 14:02:08 【问题描述】:

我正在尝试在我的 Qt 应用程序中创建多级子菜单。 为此,我使用带有目录树的向量,例如:

C:\Users\meine\Main_menu_dir\folder_1\sub1
C:\Users\meine\Main_menu_dir\folder_1\sub2
C:\Users\meine\Main_menu_dir\folder_1\sub2\subsub1
C:\Users\meine\Main_menu_dir\folder_2\sub1
C:\Users\meine\Main_menu_dir\folder_2\sub1\subsub1
C:\Users\meine\Main_menu_dir\folder_2\sub2\subsub1
C:\Users\meine\Main_menu_dir\folder_2\sub2\subsub2

我正在使用boost lib 如下:

#include "boost/filesystem.hpp"
#include <iostream>
namespace fs = ::boost::filesystem;

我正在使用迭代器遍历名称字符串并创建子菜单树:

    for (// iter --> iterator in the list of files//)
    
        if (fs::is_directory(*iter)) // from boost lib
        
            QMenu *subMenu; // create a QMenu object
            // name --> name of the directory, i.e.: folder_1, sub1, sub2, .... 
            subMenu = new QMenu(QString::fromStdString(name), recursiveMenu);
            recursiveMenu->addMenu(subMenu); 
        
       

以这种方式,我在 folder_1 下创建了所有子菜单(或者,等效地在 Main_menu_dir 下,取决于迭代器中的起点)。 recursiveMenu 是我添加子菜单的菜单。也许我应该更新它,比如:

recursiveMenu = subMenu;

如何将菜单结构更改为具有以下菜单级别:

 1. Folder_1
    1.1 sub1
    1.2 sub2
       1.2.1 subsub1
 2. Folder_2
    2.1 sub1
       2.1.1 subsub1
       2.1.2 subsub2
....

非常感谢。

【问题讨论】:

1.2.1 subsub1 必须与1.2 sub2 处于同一级别? @eyllanesc 不是。 1.2.1 (subsub1) 是我尝试进行迭代过程的 1.2 (sub2) 的子菜单。 【参考方案1】:

将 QDirIterator 与 QFileInfo 一起使用:

#include <QtWidgets>

static void fill_menu(QMenu *menu, const QString & path, const QString & prefix=)
    QDirIterator it(path, QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);
    int number = 0;
    while (it.hasNext()) 
        number++;
        QString  newprefix = QString::number(number);
        if(!prefix.isEmpty())
            newprefix.prepend(prefix + ".");
        QFileInfo info(it.next());
        QString name = newprefix + " " + info.fileName();
        if(info.isDir())
            QMenu *dirmenu = menu->addMenu(name);
            fill_menu(dirmenu, info.absoluteFilePath(), newprefix);
        
        else if(info.isFile())
            menu->addAction(name);
        
    


int main(int argc, char *argv[])

    QApplication a(argc, argv);
    QString directoryQStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
    QMainWindow w;
    QMenu menu"Files";
    w.menuBar()->addMenu(&menu);
    fill_menu(&menu, directory);
    w.show();
    return a.exec();

【讨论】:

我不确定QString 目录。它的目的是什么?它是否存储路径列表?对不起这个问题,但我是 qt 的菜鸟。 :) @PanichiPattumerosPapaCastoro 在你的情况下,目录是QString directory"C:/Users/meine/Main_menu_dir";

以上是关于Qt 中的多级子菜单的主要内容,如果未能解决你的问题,请参考以下文章

ContextMenuStrip 动态添加多级子菜单

关闭多级 jquery 下拉菜单

2.实现多级菜单

java 24 - 7 GUI之 创建多级菜单窗体

Qt学习--03Day

Qt - 使用信号/插槽关闭子菜单