Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Admin от Сентябрь 27, 2005, 14:22



Название: QTreeView и иконки
Отправлено: Admin от Сентябрь 27, 2005, 14:22
Создал модель на основе QAbstractItemModel

Подсоеденил ее к QTreeView - все отображается путем.

Хочу теперь что бы напротив каждого item стояла иконка, примерно как в QDirModel, но не нашел как.

Сорцы QDirModel не внушают уверености, так и не нашел как это они сделали.


Название: QTreeView и иконки
Отправлено: nEoN от Сентябрь 27, 2005, 17:04
Нужно у модели переопределить метод data() :
Код:
QVariant MyTableModel::data(const QModelIndex & index, int role) const
{
  switch(role)
  {
   ...
   case Qt::DecorationRole:
     return QIcon(...);
  }
  return QVariant();
}


Название: QTreeView и иконки
Отправлено: Admin от Сентябрь 27, 2005, 20:53
ага спасибо

я помаленьку сам догадался

эти модели меня с ума сводят


Название: QTreeView и иконки
Отправлено: Admin от Сентябрь 27, 2005, 21:26
теперь другой вопрос нарисовался

есть модель иерархическая
прекрасно отображается в QTreeView

в вот как ее отобразить в QListView
никак не пойму

при setModel отображается только верхний элемент и все


Название: QTreeView и иконки
Отправлено: Admin от Сентябрь 29, 2005, 14:52
оказалось что для QListView можно рулить через setRootIndex

Код:
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QDirModel *model = new QDirModel;

    //QTreeView *tree = new QTreeView;
    //tree->setModel(model);
QListView *tree = new QListView;
tree->setModel(model);
tree->setRootIndex(model->index(QDir::currentPath()));

    tree->setWindowTitle(QObject::tr("Dir View"));
    tree->resize(640, 480);
    tree->show();

    return app.exec();
}


Название: QTreeView и иконки
Отправлено: Racheengel от Сентябрь 30, 2005, 10:56
Пытался я с ентой фигней раздуплиться... ИМХО очень все усложнено, трудно с прыжка вникнуть...


Название: QTreeView и иконки
Отправлено: nEoN от Сентябрь 30, 2005, 11:46
Согласен. Простота принесена в жертву универсальности.


Название: QTreeView и иконки
Отправлено: Racheengel от Сентябрь 30, 2005, 15:52
проще=быстрей... а такая универсальность больно уж ИМХО тормозюкать будет...


Название: Re: QTreeView и иконки
Отправлено: bezzil от Сентябрь 29, 2008, 10:05
обьясните пожалуйста более подробно как вставить иконки,
может у кого нибудь есть пример как это сделать.

и такой ещё вопрос, каким образом включить Qt::DecorationRole


Название: Re: QTreeView и иконки
Отправлено: Пантер от Сентябрь 29, 2008, 10:12
Используй QStandardItemModel, там есть:
QStandardItem ( const QIcon & icon, const QString & text )?


Название: Re: QTreeView и иконки
Отправлено: bezzil от Сентябрь 29, 2008, 10:32
в ассисте в упор такого не вижу - QStandardItem ( const QIcon & icon, const QString & text )?  :(
извиняюсь не там смотрел


в конец уже запутался  :(
На сколько я понял что бы иконки вставить в дерево, нада создать свою модель, переопределить метод дата, и каким то образом выставить Qt::DecorationRole. Помогите пожалуйста может у кого нибудь есть понятный код для примера , а то в голове уже каша  :(


Название: Re: QTreeView и иконки
Отправлено: spirit от Сентябрь 29, 2008, 10:38
можно встроенные виджеты юзать, такие как QTableWidget, QTreeWidget & QListWidget, если задача не предусматривает какой-то навороченной модели.


Название: Re: QTreeView и иконки
Отправлено: bezzil от Сентябрь 29, 2008, 10:44
можно встроенные виджеты юзать, такие как QTableWidget, QTreeWidget & QListWidget, если задача не предусматривает какой-то навороченной модели.
пока что не предусматривает,
для начала нада просто дерево с иконками, запутлася потом что поиск со словами "QTreeView и иконки" как на этом форуме так и на англиских приводил меня к обусуждениям об исползовании своих моделей. Спасиба пантеру, начинает прояснятся, что искал видимо не совсем то =)


Название: Re: QTreeView и иконки
Отправлено: spirit от Сентябрь 29, 2008, 10:53
у каждого из виджетов есть классы-айтемы, которые непосредственно помагают сохранять/извлекать данные из модели. классы:
QTableWidgetItem, QTreeWidgetItem & QListWidgetItem.


Название: Re: QTreeView и иконки
Отправлено: bezzil от Сентябрь 29, 2008, 11:23
Код:
	QDir dir;
dir.cd("C:/");
QStringList FileList=dir.entryList();
int listsize=FileList.size();
QDockWidget *somedock = new QDockWidget;
QTreeView *view = new QTreeView;
             QStandardItemModel newitemmodel;
for (int i = 0;i < listsize; ++i)
{
QStandardItem *item = new QStandardItem(QIcon("C:\install\icon.bmp"),FileList[i]);
newitemmodel.appendRow(item);
}
view->setModel(&newitemmodel);
view->setHeaderHidden(1);
somedock->setWidget(view);

addDockWidget(Qt::RightDockWidgetArea,somedock);

вот такой код получился, но что то не так, потому что дерево получается пустым  :)


Название: Re: QTreeView и иконки
Отправлено: spirit от Сентябрь 29, 2008, 11:35
ну во-первых, модель нужно создавать через оператор new.
во-вторых, уже есть готовая QDirModel.


Название: Re: QTreeView и иконки
Отправлено: bezzil от Сентябрь 29, 2008, 11:53
про дир модел знаю.
Я список файлов создаю для примера, хочу научится иконку вставлять.



Название: Re: QTreeView и иконки
Отправлено: spirit от Сентябрь 29, 2008, 12:04
пример взят из асистанта и немного модифицирован
Код:
...
QTreeView *view = new QTreeView(this);
QStandardItemModel *model = new QStandardItemModel();
QStandardItem *parentItem = model->invisibleRootItem();
for (int i = 0; i < 4; ++i) {
QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
item->setIcon(QIcon("addtab.png"));
parentItem->appendRow(item);
parentItem = item;
}
view->setModel(model);
...


Название: Re: QTreeView и иконки
Отправлено: bezzil от Сентябрь 29, 2008, 12:32
иконки всё равно нету (


Название: Re: QTreeView и иконки
Отправлено: spirit от Сентябрь 29, 2008, 12:34
выложи пример компилябильный.


Название: Re: QTreeView и иконки
Отправлено: bezzil от Сентябрь 29, 2008, 12:43
Код:
Monitor::Monitor(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
QDir dir;
dir.cd("C:/");
QStringList FileList=dir.entryList();
QString CurrentDir=dir.rootPath();
int listsize=FileList.size();


QDockWidget *somedock = new QDockWidget;
QTreeView *view = new QTreeView;
QStandardItemModel *newitemmodel = new QStandardItemModel;
QStandardItem *parentItem = newitemmodel->invisibleRootItem();
for (int i = 0;i < listsize; ++i)
{
QIcon icon("C:\Install\icon.png");
  QStandardItem *item = new QStandardItem(FileList[i]);
item->setIcon(icon);
parentItem->appendRow(item);
}
view->setModel(newitemmodel);
view->setHeaderHidden(1);
somedock->setWidget(view);
addDockWidget(Qt::RightDockWidgetArea,somedock);

}

вот класс полностью, достаточно в мейне
Код:
Monitor w;
w.show();
, ну ты сам знаешь, в ВС 2005 с интегрированным КуТе компилится без проблем.


Название: Re: QTreeView и иконки
Отправлено: spirit от Сентябрь 29, 2008, 12:47
путь неверный
Код:
QIcon icon("C:\Install\icon.png");
должно быть так
Код:
QIcon icon("C:\\Install\\icon.png");
а еще лучше для Qt так
Код:
QIcon icon("C:/Install/icon.png");
а еще лучше юзать ресурсы


Название: Re: QTreeView и иконки
Отправлено: bezzil от Сентябрь 29, 2008, 12:50
спирит я тебя расцеловать готов. Спасиба громадное.


Название: Re: QTreeView и иконки
Отправлено: EhTemka от Сентябрь 30, 2008, 10:54
Вообще у моделей, наследованых от QAbstractItemModel, есть функция
setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole).

ТАк что иконки можно задавать с её помощью :

Код:
model->setData(model->index(i,j,parent), QIcon("C:/Install/icon.png"), Qt::DecorationRole)

А делегат уже сам разбереться, что ему рисовать...