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 中的多级子菜单的主要内容,如果未能解决你的问题,请参考以下文章