Russian Qt Forum
Ноябрь 24, 2024, 19:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qfilesystemmodel монтирование устройства  (Прочитано 5250 раз)
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« : Март 14, 2015, 10:50 »

здравствуйте сделал простенький проект
tableview и две кнопки pushbutton
отображаю стандартный qfilesystemmodel в tablewview


Код:
#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 хотя стандартный менеджер операционки видит все каталоги и папки на ней даже после повторного монтирования...
что можно сделать?
 
« Последнее редактирование: Март 14, 2015, 14:23 от koldun90 » Записан
Hrundel
Гость
« Ответ #1 : Март 15, 2015, 14:01 »

Ну, а в model1 ты сбрасываешь данные каким-то образом? Очищаешь ее где-то, или что-то типа того? Посмотри в документации как с моделью работать.
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #2 : Март 15, 2015, 15:02 »

там ничего нет про очистку qfilesystemmodel...
не знаю в чем проблема...
Записан
Hrundel
Гость
« Ответ #3 : Март 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"));
   }
}
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #4 : Март 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?
чтобы все корректно работало...
« Последнее редактирование: Март 15, 2015, 17:41 от koldun90 » Записан
Hrundel
Гость
« Ответ #5 : Март 15, 2015, 19:08 »

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

Пологаю, что так должно быть, если верить докам.
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #6 : Март 15, 2015, 20:08 »

спасибо проблема вроде бы решилась)
не знал вообще про вызов setrootpath перед setRootindex
очень помогли...
Записан
Hrundel
Гость
« Ответ #7 : Март 15, 2015, 20:19 »

Я тоже не знал. Сам сегодня первый раз читал про этот класс.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.087 секунд. Запросов: 23.