我想在我的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
....
非常感谢。
将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 directory{QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)};
QMainWindow w;
QMenu menu{"Files"};
w.menuBar()->addMenu(&menu);
fill_menu(&menu, directory);
w.show();
return a.exec();
}