Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Digan от Август 20, 2011, 19:14



Название: [QTreeWidget] Построение структуры каталогов
Отправлено: Digan от Август 20, 2011, 19:14
Есть у кого-то пример построения структуры каталогов на диске на основе QTreeWidget?
То есть нужно построить дерево каталогов как например в Проводнике Windows.

Или хотя бы подскажите как с помощью Qt получить список логических дисков и список файлов в папке без применения WinAPI.


Название: Re: [QTreeWidget] Построение структуры каталогов
Отправлено: alex312 от Август 20, 2011, 19:30
Такой (http://doc.qt.nokia.com/4.7/itemviews-dirview.html) сойдет?


Название: Re: [QTreeWidget] Построение структуры каталогов
Отправлено: Digan от Август 20, 2011, 20:40
Такой (http://doc.qt.nokia.com/4.7/itemviews-dirview.html) сойдет?

Спасибо за пример.
Гм. Если пишу следующий код в конструкторе главного окна, то почему-то ничего не выводиться.

Код
C++ (Qt)
   QFileSystemModel model;
   model.setRootPath("");
   ui->treeView->setModel(&model);
 
   ui->treeView->setAnimated(false);
   ui->treeView->setIndentation(20);
   ui->treeView->setSortingEnabled(true);
 
   ui->treeView->setWindowTitle(QObject::tr("Dir View"));
   ui->treeView->show();
 


Название: Re: [QTreeWidget] Построение структуры каталогов
Отправлено: alex312 от Август 20, 2011, 20:56
потому что надо для главного окна вызвать метод show() .


Название: Re: [QTreeWidget] Построение структуры каталогов
Отправлено: Digan от Август 20, 2011, 21:04
Я итак вызываю show для главного окна в main.
Имелось ввиду, что на treeView ничего не появляется при запуске. Он пустой.


Название: Re: [QTreeWidget] Построение структуры каталогов
Отправлено: LisandreL от Август 20, 2011, 21:15
model у вас локальная.
При выходе из конструктора она удаляется.
Порождайте её динамически:
Код:
    QFileSystemModel* model = new QFileSystemModel();
    model->setRootPath("");
    ui->treeView->setModel(model);


Название: Re: [QTreeWidget] Построение структуры каталогов
Отправлено: Digan от Август 20, 2011, 21:34
model у вас локальная.
При выходе из конструктора она удаляется.
Порождайте её динамически:
Код:
    QFileSystemModel* model = new QFileSystemModel();
    model->setRootPath("");
    ui->treeView->setModel(model);

Благодарю. Теперь работает.

Интересует еще один вопрос. Как при клике в дереве на файл получить его полное имя?
Я так понял это нужно обрабатывать в слоте:
Код
C++ (Qt)
void MainWindow::on_treeView_clicked(const QModelIndex &index)
{
 
}
 

Но как получить полное имя файла по которому кликнул мышкой в дереве?

Пробовал такой вариант:
Код
C++ (Qt)
void MainWindow::on_treeView_clicked(const QModelIndex &index)
{
   QVariant variant = index.data();
 
   QString name = variant.value<QString>();
 
   QMessageBox *messageBox = new QMessageBox();
   messageBox->setText(name);
   messageBox->show();
}
 
Но так выводит только имя файла, а путь к нему не выводит.
 

Решено вот так:
Код
C++ (Qt)
void MainWindow::on_treeView_clicked(const QModelIndex &index)
{
   QString name = ((QFileSystemModel*)ui->treeView->model())->filePath(index);
 
   QMessageBox *messageBox = new QMessageBox();
   messageBox->setText(name);
   messageBox->show();
}