2016-11-23 8 views
1

Я делаю программу, которая должна иметь возможность выводить имена файлов из определенной папки в качестве элементов в Tree Widget, но Кажется, я не понимаю. Мне удалось сделать это в виджетах списка без лишних хлопот, но я не могу заставить этот код работать с виджетам дерева. Ниже приведен код, который я написал, чтобы получить описанную функциональность виджета спискаКак получить имена файлов из папки и добавить их в виджет дерева в виде дочерних элементов в qt

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    QString path = "C:/Program Files/GUI_Project/bin"; 
    QDir dir(path); 
    if (!dir.exists()) 
     { 
      dir.mkpath(path); 
     } 
    QDir myPath(path); 
    myPath.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); 
    MyList = myPath.entryList(); 
    ui->listWidget->addItems(MyList); 
} 
+0

Это может помочь: http://doc.qt.io/qt-5/qfilesystemmodel.html –

+0

Проблема с этим - я не хочу, чтобы отображались какие-либо каталоги, просто имена файла в определенной папке – Nick

ответ

0

Вы просто итерацию над списком ввода и создания QTreeWidgetItem объекта для каждой записи.

Если вы передадите виджет дерева в качестве родителя, он станет элементом верхнего уровня в дереве, если вы передадите другой элемент виджета дерева в качестве родителя, он станет дочерней записью этого элемента.

+0

. работать, если количество элементов в папке изменяется случайным образом? – Nick

+0

@Nick Нет, это не так, как я объяснил в своем ответе. Мой ответ - это путь к брату:/ – mrg95

+0

@ Ник, вы можете, конечно, перестроить элементы, когда это необходимо, но, как сказал mc360pro, подход на основе модели сделает это более красиво. –

1

Другой вариант - использовать QFileSystemModel и использовать setRootPath("your/path") для создания модели папки. Вы можете использовать setFilter(), чтобы решить, что показано Filter List. Затем вы можете добавить эту модель в QTreeView. Это точно так же, как QTreeWidget, за исключением того, что он имеет гораздо лучшую производительность и является лучшим вариантом для большинства случаев использования imo. Например, если файл будет добавлен или удален из этого каталога, модель изменится и обновится в вашей программе. A QTreeWidget не может этого сделать.

QFileSystemModel *dirModel = new QFileSystemModel(); //Create new model 
dirModel->setRootPath("C:/Program Files/GUI_Project/bin"); //Set model path 
dirModel->setFilter(QDir::Files); //Only show files 

ui->treeView->setModel(dirModel); //Add model to QTreeView 

QModelIndex idx = dirModel->index("C:/Program Files/GUI_Project/bin"); //Set the root item 
ui->treeView->setRootIndex(idx); 

Если вы хотите придерживаться с QTreeWidget однако, вам придется рекурсивно перебрать папки содержимое и добавить каждый элемент в отдельности.

+0

Я не хочу, чтобы пользователь мог видеть свои диски в программе, хотя они должны были видеть только папку и элементы в ней, ничего больше – Nick

+0

Все эти вещи настраиваются с помощью setFilter http: // doc. qt.io/qt-5/qdir.html#Filter-enum. И установка rootPath и корневого элемента делает вашу выбранную папку корневым объектом. Пожалуйста, перечитайте мой пост, и вы можете это увидеть. Это то, что я использую в своих проектах все время. Вот пример, который я использую в одной из моих старых программ: https://i.gyazo.com/1bf1c355802546d6001c5633205b3460.png Это всего лишь содержимое каталога – mrg95

+0

Вы уже реализовали это? Это был бы правильный способ пойти, что вам нужно. Если да, примите мой ответ. – mrg95