Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Получить адрес папки из QTableView, QFileSystemModel и QTableView 
V
    Опции темы
qwerty455
Дата 15.6.2011, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 15.6.2011

Репутация: нет
Всего: нет



hi)
пытаюсь сделать чтото похожее на total commander 
http://s55.radikal.ru/i150/1106/30/045139f31297.jpg

как получить адрес выделенной папки в tableView ?
пыталась так:
Код

// кнопка назад
void Window::on_backBtn_clicked()
{
    QDir currDir = dirmodel->Path(index); //???
    currDir.cdUp();
    QString sPath = currDir.path();
    ui->tableView->setRootIndex(dirmodel->setRootPath(sPath));
}

и можно ли убрать индексацию в начале строки?)
PM MAIL   Вверх
Greeneyed
Дата 17.6.2011, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 20.4.2006

Репутация: нет
Всего: нет



Может QDir currDir = dirmodel->Path(ui->tableView->currentIndex()); ?
PM MAIL   Вверх
qwerty455
Дата 18.6.2011, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 15.6.2011

Репутация: нет
Всего: нет



Greeneyed
не помогло)
думаю надо юзать QItemSelectionModel , но не знаю как >.< , потом из selectionModel достать путь папки и сделать cdUp )
PM MAIL   Вверх
Greeneyed
Дата 19.6.2011, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 20.4.2006

Репутация: нет
Всего: нет



а в dirmodel->Path() какой индекс должен передаваться?
PM MAIL   Вверх
qwerty455
Дата 20.6.2011, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 15.6.2011

Репутация: нет
Всего: нет



Greeneyed
по идее потом с selection() можно вытянуть.

но у меня пока с этим проблемы)
Код

#include "window.h"
#include "ui_window.h"
#include <QMessageBox>


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

    QString sPath = "/";
    dirmodel = new QFileSystemModel(this);
    dirmodel->setRootPath(sPath);
    ui->tableView_2->setModel(dirmodel);
    ui->tableView->setModel(dirmodel);

    selectmodel = new QItemSelectionModel(dirmodel);
    ui->tableView->setSelectionModel(selectmodel);
    ui->tableView_2->setSelectionModel(selectmodel);

}

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

void Window::on_tableView_2_doubleClicked(QModelIndex index)
{
    QString sPath = dirmodel->fileInfo(index).absoluteFilePath();
    ui->tableView_2->setRootIndex(dirmodel->setRootPath(sPath));
}

void Window::on_tableView_doubleClicked(QModelIndex index)
{
    QString sPath = dirmodel->fileInfo(index).absoluteFilePath();
    ui->tableView->setRootIndex(dirmodel->setRootPath(sPath));
}

void Window::on_backBtn_clicked()
{
   if (ui->tableView->selectmodel->hasSelection()/*???*/ == true) {
        QMessageBox::information(0, "Message", "tableview is active");}
        else { QMessageBox::about(0, "Message", "tableview is non active"); }
}

в строке if пишет что selectmodel не существует..) как правильно подключать selectionModel ?
PM MAIL   Вверх
Greeneyed
Дата 20.6.2011, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 20.4.2006

Репутация: нет
Всего: нет



Во-первых, уберите 

Код

selectmodel = new QItemSelectionModel(dirmodel);
ui->tableView->setSelectionModel(selectmodel);
ui->tableView_2->setSelectionModel(selectmodel);


Зачем вам одна модель выделения на две таблице? Или вы хотите, чтоб выделенные в одной таблице папки были выделенны и в другой?

Во-вторых, сделайте выделение в таблицах построчное. Для файлового менеджера это удобно.

Код

ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);


А вот код получения полного пути к выделенным папкам.

Код

    QModelIndexList indexList = ui->tableView->selectionModel()->selectedRows();
    QListIterator<QModelIndex> i(indexList);
    while(i.hasNext())
    {
        QModelIndex index = i.next();
        QMessageBox::information(this, tr("Path"), tr("%1").arg(dirmodel->fileInfo(index).absoluteFilePath()), QMessageBox::Ok);
    }

PM MAIL   Вверх
qwerty455
Дата 21.6.2011, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 15.6.2011

Репутация: нет
Всего: нет



Greeneyed
теперь помогло) спасибо smile

Код

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

    QString sPath = "/";
    dirmodel = new QFileSystemModel(this);
    dirmodel->setRootPath(sPath);
    ui->tableView_2->setModel(dirmodel);
    ui->tableView->setModel(dirmodel);

    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    ui->tableView_2->setSelectionBehavior(QAbstractItemView::SelectRows);
}

void Window::on_tableView_2_doubleClicked(QModelIndex index)
{
    QString sPath = dirmodel->fileInfo(index).absoluteFilePath();
    ui->tableView_2->setRootIndex(dirmodel->setRootPath(sPath));
}

void Window::on_tableView_doubleClicked(QModelIndex index)
{
    QString sPath = dirmodel->fileInfo(index).absoluteFilePath();
    ui->tableView->setRootIndex(dirmodel->setRootPath(sPath));
}

void Window::on_backBtn_clicked()
{
    QModelIndexList indexList = ui->tableView->selectionModel()->selectedRows();
    QListIterator<QModelIndex> i(indexList);
    while(i.hasNext())
    {
        QModelIndex index = i.next();
        QMessageBox::information(this, tr("Path tableView"), tr("%1").arg(dirmodel->fileInfo(index).absoluteFilePath()), QMessageBox::Ok);
        QDir dir = dirmodel->fileInfo(index).absoluteFilePath();
        dir.cdUp();
        QString sPath = dir.path();
        ui->tableView->setRootIndex(dirmodel->setRootPath(sPath));
    }

почему я не могу переместиться в рутовую папку "/"  ?)
PM MAIL   Вверх
Greeneyed
Дата 22.6.2011, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 20.4.2006

Репутация: нет
Всего: нет



Так бы и сказали, что вам просто нужна кнопка "Назад". Зачем для этого получать имена ВСЕХ выделенных папок? Да и зачем вообще получать имя выделенной папки? Ведь пользователь может кликнуть "назад" до клика по какой-нибудь папке. Или открытая папка будет пуста и пользователю просто не чего будет выделять.

Этот код получает родителя текущей открытой папки и устанавливает его в качестве корневого индекса.
Код

QModelIndex cdUpIndex = (QModelIndex)ui->tableView->rootIndex().parent();
ui->tableView->setRootIndex(cdUpIndex );

PM MAIL   Вверх
qwerty455
Дата 23.6.2011, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 15.6.2011

Репутация: нет
Всего: нет



Greeneyed
про кнопку "назад" еще в первом посте написала)
но наверно плохо продумала действия.
спасибо за код)
PM MAIL   Вверх
Greeneyed
Дата 23.6.2011, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 20.4.2006

Репутация: нет
Всего: нет



На комментарий в коде я внимания не обратил. Я увидел только "как получить адрес выделенной папки в tableView ?".
Пометьте тему, как решенную. А зачем, если не секрет, писать свой файловый менеджер? Ведь есть уже много хороших и бесплатных.
PM MAIL   Вверх
qwerty455
Дата 23.6.2011, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 15.6.2011

Репутация: нет
Всего: нет



>> А зачем, если не секрет, писать свой файловый менеджер?

чтоб глубже понырять..)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1193 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.