Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Larry от Ноябрь 26, 2017, 14:55



Название: [РЕШЕНО]Боковое меню ввиде дерева
Отправлено: Larry от Ноябрь 26, 2017, 14:55
Добрый день, форумчане.
Необходимо реализовать боковое меню ввиде дерева. Возник вопрос, как у QTreeWidget поменять индикаторы свертывания/развертывания...
Сделать необходимо, что-то типа такого как на рисунке.
Я так понимаю что это необходимо делать через делегаты?! Или я ошибаюсь и можно как-то по другому?
Спасибо.


Название: Re: Боковое меню ввиде дерева
Отправлено: gil9red от Ноябрь 27, 2017, 09:20
Через стили, я думаю, можно иконку поменять: https://stackoverflow.com/questions/16018974/qtreeview-remove-decoration-expand-button-for-all-items

Еще, думаю, попробовать через DecorationRole изменить. (тогда и через какой-нибудь item.setIcon у сложных моделей будет работать)


Название: Re: Боковое меню ввиде дерева
Отправлено: Larry от Ноябрь 27, 2017, 09:36
Спасибо большое. Попробую.


Название: Re: Боковое меню ввиде дерева
Отправлено: sergek от Ноябрь 27, 2017, 10:14
Может, так:
Код
C++ (Qt)
QVariant CScriptCollectionModel::data(const QModelIndex &index, int role) const
{
   if (!index.isValid())
       return QVariant();
 
   // icons
   if(role==Qt::DecorationRole) {
       QString icon;
       if(getItem(index)->isScript()) {
           // scripts
           icon=(index.column()==0)? ":/images/script_16.png" : ":/images/link_pointer.png";
       } else if (index.column()==0) {
           // folders
           icon=(treeView->isExpanded(index))?
                ":/images/folderopen1.png":":/images/folderclosed1.png";
       }
       return QIcon(icon);
 
   // names
   } else if (role == Qt::DisplayRole || role == Qt::EditRole) {
       return getItem(index)->data(index.column());
 
   } else
       return QVariant();
}


Название: Re: Боковое меню ввиде дерева
Отправлено: Larry от Ноябрь 27, 2017, 15:56
Здесь надо поменять внешний вид изображения сворачивания/разворачивания ("птички вправо/вниз")...И как писал выше gil9red - это можно сделать через стили...еще не пробовал, но в стилях есть свойство branch и там можно поменять изображения "branch-open.png" и "branch-closed.png".


Название: Re: Боковое меню ввиде дерева
Отправлено: Larry от Ноябрь 27, 2017, 15:59
В примерах по стилям как раз есть замена изображений в ветках:
http://doc.qt.io/qt-5/stylesheet-examples.html


Название: Re: Боковое меню ввиде дерева
Отправлено: Larry от Ноябрь 27, 2017, 19:35
Попробовал, как в примерах и все заработало.
В стилях QTreeWidget прописал следующее:

Код:
QTreeView::branch:has-children:!has-siblings:closed,
QTreeView::branch:closed:has-children:has-siblings
{
        border-image: none;
        image: url(:/images/resource/images/branch_close.png);
}

QTreeView::branch:open:has-children:!has-siblings,
QTreeView::branch:open:has-children:has-siblings 
{
        border-image: none;
        image: url(:/images/resource/images/branch_open.png);
}