Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] Получить адрес папки из QTableView


Автор: qwerty455 15.6.2011, 19:25
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));
}

и можно ли убрать индексацию в начале строки?)

Автор: Greeneyed 17.6.2011, 21:55
Может QDir currDir = dirmodel->Path(ui->tableView->currentIndex()); ?

Автор: qwerty455 18.6.2011, 19:47
Greeneyed
не помогло)
думаю надо юзать QItemSelectionModel , но не знаю как >.< , потом из selectionModel достать путь папки и сделать cdUp )

Автор: Greeneyed 19.6.2011, 13:47
а в dirmodel->Path() какой индекс должен передаваться?

Автор: qwerty455 20.6.2011, 13:36
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 ?

Автор: Greeneyed 20.6.2011, 19:02
Во-первых, уберите 

Код

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);
    }

Автор: qwerty455 21.6.2011, 10:19
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));
    }

почему я не могу переместиться в рутовую папку "/"  ?)

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

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

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

Автор: qwerty455 23.6.2011, 14:15
Greeneyed
про кнопку "назад" еще в первом посте написала)
но наверно плохо продумала действия.
спасибо за код)

Автор: Greeneyed 23.6.2011, 20:58
На комментарий в коде я внимания не обратил. Я увидел только "как получить адрес выделенной папки в tableView ?".
Пометьте тему, как решенную. А зачем, если не секрет, писать свой файловый менеджер? Ведь есть уже много хороших и бесплатных.

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

чтоб глубже понырять..)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)