#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"};