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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с получением списка файлов  (Прочитано 1771 раз)
jaykey
Гость
« : Июнь 29, 2010, 12:41 »

Доброго всем времени суток!
Волею судеб, пришлось осваивать Qt.

Нужно сделать такую штуку: табличка, в которой будет содержаться инфа о файлах выбранной директории, а в последнем столбце - кнопка, событие clicked() которой будет обрабатываться.

Я наметил 2 пути решения:
1) Использовать QStandardItemModel, используя примерно такой код:
Код:
...
QFileInfoList FileInfoList;
QString workDir="C:\\";

GetFilesFromDir(FileInfoList, workDir); // получаем список файлов

int size_i = FileInfoList.count(), size_j = 3;
QStandardItemModel* model = new QStandardItemModel(size_i, size_j, this);

int ii = 0;

foreach (QFileInfo i, FileInfoList)
{
QStandardItem* itm0 = new QStandardItem, * itm1 = new QStandardItem;
itm0->setData(QVariant(i.fileName()), Qt::EditRole);
itm1->setData(QVariant(i.size()), Qt::DisplayRole);
model->setItem(ii, 0, itm0);
model->setItem(ii, 1, itm1);
ii++;
}

tableView->setModel(model);

tableView->setSelectionMode(QAbstractItemView::NoSelection);
tableView->setItemDelegate(new ButtonDelegate(this));

for (int i = 0; i < tableView->model()->rowCount(); ++i)
{
tableView->openPersistentEditor(tableView->model()->index(i, 2, QModelIndex()));
}
...
Все получается как надо, за исключением маленького "но": в первом столбце нет иконок файлов (как я понял, в QFileInfoList они не содержатся). Может быть их можно вытащить откуда-то еще?

2) почти тоже самое, но через QFileSystemModel:
Код:
...
QFileSystemModel* model = new QFileSystemModel(this);

tableView->setModel(model);
const QModelIndex root = model->setRootPath("C:\\");
tableView->setRootIndex(root);

tableView->setSelectionMode(QAbstractItemView::NoSelection);
tableView->setItemDelegate(new ButtonDelegate(this));

for (int i = 0; i < tableView->model()->rowCount(); ++i)
{
tableView->openPersistentEditor(tableView->model()->index(i, 2, QModelIndex()));
}
...
В этом варианте есть икнки у файлов и папок, но не создаются кнопки-делегаты.
Правильно ли я понимаю, что для пары tableView + QFileSystemModel нельзя создать делегатов, или я что-то делаю не так? В какую сторону копать?

P.S. Класс ButtonDelegate:
Код:
#ifndef BUTTONDELEGATE_H
#define BUTTONDELEGATE_H

#include <QItemDelegate>

class ButtonDelegate : public QItemDelegate
{
    Q_OBJECT
public:
ButtonDelegate(QWidget* parent = 0);
QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
private slots:
void emitMessageBox();
};

#endif

// Реализация
#include <QtGui>

#include "buttondelegate.h"

ButtonDelegate::ButtonDelegate(QWidget* parent) : QItemDelegate(parent)
{
}

QWidget* ButtonDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if (index.column() == 2)
{
QPushButton* button = new QPushButton(parent);
button->setText("Button");
return button;
}
else
{
return QItemDelegate::createEditor(parent, option, index);
}
    return NULL;
}

void ButtonDelegate::emitMessageBox()
{
QMessageBox::information(0, "createEditor", "Reaction on the Button Click", QMessageBox::Ok);
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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