Подменю нескольких уровней в Qt

#c #algorithm #qt #c 11 #qt5

#c #алгоритм #qt #c 11 #qt5

Вопрос:

Я пытаюсь создать многоуровневые подменю в своем Qt приложении. Для этой цели я использую вектор с деревом каталогов, примером которого является:

 C:UsersmeineMain_menu_dirfolder_1sub1
C:UsersmeineMain_menu_dirfolder_1sub2
C:UsersmeineMain_menu_dirfolder_1sub2subsub1
C:UsersmeineMain_menu_dirfolder_2sub1
C:UsersmeineMain_menu_dirfolder_2sub1subsub1
C:UsersmeineMain_menu_dirfolder_2sub2subsub1
C:UsersmeineMain_menu_dirfolder_2sub2subsub2
  

Я использую boost библиотеку следующим образом:

 #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. 1.2.1 subsub1 должно быть на том же уровне, 1.2 sub2 что и?

2. @eyllanesc not. 1.2.1 (subsub1) — это подменю 1.2 (sub2) из этой моей попытки создания итеративного процесса.

Ответ №1:

Использование QDirIterator с QFileInfo:

 #include <QtWidgets>

static void fill_menu(QMenu *menu, const QString amp; path, const QString amp; 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 directory{QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)};
    QMainWindow w;
    QMenu menu{"Files"};
    w.menuBar()->addMenu(amp;menu);
    fill_menu(amp;menu, directory);
    w.show();
    return a.exec();
}
  

Комментарии:

1. Я не уверен насчет QString каталога. Для чего это нужно? Хранит ли он список путей? Извините за этот вопрос, но я новичок в qt. 🙂

2. @PanichiPattumerosPapaCastoro В вашем случае каталог QString directory{"C:/Users/meine/Main_menu_dir"};