Доброго всем времени суток!
Волею судеб, пришлось осваивать 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);
}