Russian Qt Forum

Qt => Вопросы новичков => Тема начата: koldun90 от Март 14, 2015, 10:50



Название: Qfilesystemmodel монтирование устройства
Отправлено: koldun90 от Март 14, 2015, 10:50
здравствуйте сделал простенький проект
tableview и две кнопки pushbutton
отображаю стандартный qfilesystemmodel в tablewview
(http://s014.radikal.ru/i329/1503/24/2d6cf0cf2a16.png) (http://www.radikal.ru)

Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    model1=new QFileSystemModel;
    model1->setFilter(QDir::AllDirs | QDir::Files);
    model1->setRootPath(QDir::currentPath());
    ui->tableView->setModel(model1);

}

MainWindow::~MainWindow()
{
    delete ui;
}

//КЛик по кнопке монтировать

void MainWindow::on_pushButton_clicked()
{
    int k=system(QString("mount /mnt/sdb1").toLocal8Bit().data());
    if (k==0)
    {
        QMessageBox msg;
        msg.setText(QString::fromLocal8Bit("смонтировано"));
        msg.exec();
        ui->tableView->setRootIndex(model1->index("/mnt/sdb1"));
    }
}

//Клик по кнопке размонтировать

void MainWindow::on_pushButton_2_clicked()
{
    int k=system(QString("umount /mnt/sdb1").toLocal8Bit().data());
    if (k==0)
    {
        QMessageBox msg;
        msg.setText(QString::fromLocal8Bit("размонтировано"));
        msg.exec();
        ui->tableView->setRootIndex(model1->index("/"));
    }
}


//переход в каталог по двойному клику
void MainWindow::on_tableView_Doubleclicked(const QModelIndex &index)
{
    if (model1->fileInfo(index).isDir())
    {
        if (model1->fileInfo(index).isReadable())
        {
            ui->tableView->setRootIndex(index);
        }
    }
}

Смысл в том что когда я монтирую устройство tableview переходит в каталог с примонтированным устройством (/mnt/sdb1)
когда я размонтирую устройство переходит в корневой каталог ("/")
Ну и соответственно когда я кликаю двойным нажатие мыши по папке он заходит в папку.

Проблема заключается в следующем:
Допустим я делаю вот так.
1) Запускаю прогу
2) жму кнопку монтировать  --устройство примонтировалось отобразилось сообщение смонтировано и tableview перешел в каталог /mnt/sdb1
3) потом жму размонтировать--- устройство размонтировалось отобразилось сообщение размонтировано и  tableview перешел в каталог /--корень


4) жму снова кнопку монтировать---устройство примонтировалось отобразилось сообщение смонтировано и tableview перешел в каталог /mnt/sdb1 НО все содержимое флешки не отображается видно только папку с .. и с . хотя на флешке есть и папки и файлы.

Так что проблема собственно что при повторном монтировании не отображается содержимое /mnt/sdb1 хотя стандартный менеджер операционки видит все каталоги и папки на ней даже после повторного монтирования...
что можно сделать?
 


Название: Re: Qfilesystemmodel монтирование устройства
Отправлено: Hrundel от Март 15, 2015, 14:01
Ну, а в model1 ты сбрасываешь данные каким-то образом? Очищаешь ее где-то, или что-то типа того? Посмотри в документации как с моделью работать.


Название: Re: Qfilesystemmodel монтирование устройства
Отправлено: koldun90 от Март 15, 2015, 15:02
там ничего нет про очистку qfilesystemmodel...
не знаю в чем проблема...


Название: Re: Qfilesystemmodel монтирование устройства
Отправлено: Hrundel от Март 15, 2015, 17:22
Ну там же написано:

Цитировать
QFileSystemModel will not fetch any files or directories until setRootPath() is called. This will prevent any unnecessary querying on the file system until that point such as listing the drives on Windows.

QFileSystemModel не будет получать какие-либо файлы или каталоги, пока не вызван setRootPath().

Дальше соответственно надо вызывать QModelIndex QFileSystemModel::setRootPath(const QString & newPath)

Код
C++ (Qt)
void MainWindow::on_pushButton_clicked()
{
   int k=system(QString("mount /mnt/sdb1").toLocal8Bit().data());
   if (k==0)
   {
       QMessageBox msg;
       msg.setText(QString::fromLocal8Bit("смонтировано"));
       msg.exec();
       model1->setRootPath(QString("/mnt/sdb1"));
       ui->tableView->setRootIndex(model1->index("/mnt/sdb1"));
   }
}


Название: Re: Qfilesystemmodel монтирование устройства
Отправлено: koldun90 от Март 15, 2015, 17:39


Код
C++ (Qt)
//КЛик по кнопке монтировать
 
void MainWindow::on_pushButton_clicked()
{
   int k=system(QString("mount /mnt/sdb1").toLocal8Bit().data());
   if (k==0)
   {
       model`->setRootPath(QString("/mnt/sdb1"));
       ui->tableView->setRootIndex(model1->index("/mnt/sdb1"));
   }
}
 
//Клик по кнопке размонтировать
 
void MainWindow::on_pushButton_2_clicked()
{
   int k=system(QString("umount /mnt/sdb1").toLocal8Bit().data());
   if (k==0)
   {
       model1->setRootPath(QString("/"));
       ui->tableView->setRootIndex(model1->index("/"));
   }
}

те я вас правильно понял
если я вызываю QFileSystemModel::setRootIndex то перед ним я должен всегда вызывать QFileSystemModel::setRootPath?
чтобы все корректно работало...


Название: Re: Qfilesystemmodel монтирование устройства
Отправлено: Hrundel от Март 15, 2015, 19:08
те я вас правильно понял
если я вызываю QFileSystemModel::setRootIndex то перед ним я должен всегда вызывать QFileSystemModel::setRootPath?
чтобы все корректно работало...

Пологаю, что так должно быть, если верить докам.


Название: Re: Qfilesystemmodel монтирование устройства
Отправлено: koldun90 от Март 15, 2015, 20:08
спасибо проблема вроде бы решилась)
не знал вообще про вызов setrootpath перед setRootindex
очень помогли...


Название: Re: Qfilesystemmodel монтирование устройства
Отправлено: Hrundel от Март 15, 2015, 20:19
Я тоже не знал. Сам сегодня первый раз читал про этот класс.