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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: PyQt4 QTreeWidget Перерисовка иконок скрытия\Показа child елементов.  (Прочитано 5574 раз)
bmw
Гость
« : Октябрь 18, 2010, 17:49 »

Доброго времени суток! Возникла необходимость перерисовать иконки скрытия child элементов QTreeWidget (
  • \[-]), т.к по дефолту они отображаются слева у 0-ого столбца. (Перерисовать необходимо справа)
Перерисовать удалось, но вот установить иконки для разных состояний не выходит.
Используется PyQt4 и qt4.6.
Вопрос сводится к тому, как узнать состояние (isExpanded) для QWidgetItem. Возможно не совсем понятно объяснил, но думаю по коду станет яснее.
Код
Python
class rstreeDelegate(QtGui.QItemDelegate):
 
   def __init__(self, parent):
       QtGui.QItemDelegate.__init__(self, parent);
       self.parent = parent;
 
   def paint(self,painter,option,index):    
       model = index.model();
 
       if(not model.parent(index).isValid()):
           branchOption = QtGui.QStyleOption();
           i = 9;
           r = option.rect;
           branchOption.rect = QtCore.QRect(r.right() - i - i/2, r.top() + (r.height() - i)/2, i, i);
           branchOption.palette = option.palette;
           branchOption.state = QtGui.QStyle.State_Children;
 
           if(QtGui.QTreeView().isExpanded(index)): #this check not work :(
               print("expand!!!!");
               branchOption.state |= QtGui.QStyle.State_Open;            
 
           QtGui.QApplication.style().drawPrimitive(QtGui.QStyle.PE_IndicatorBranch, branchOption, painter);
 

На C++ Это реализовывалось так:
Код
C
SheetDelegate::SheetDelegate(QTreeView *view, QWidget *parent)
   : QItemDelegate(parent),
     m_view(view)
{
}
 
void SheetDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
   const QAbstractItemModel *model = index.model();
   Q_ASSERT(model);
   if (!model->parent(index).isValid()) {
       // this is a top-level item.
 
       QStyleOption branchOption;
       static const int i = 9;
       QRect r = option.rect;
       branchOption.rect = QRect(r.left() + i/2, r.top() + (r.height() - i)/2, i, i);
       branchOption.palette = option.palette;
       branchOption.state = QStyle::State_Children;
 
       if (m_view->isExpanded(index))
           branchOption.state |= QStyle::State_Open;
 
       m_view->style()->drawPrimitive(QStyle::PE_IndicatorBranch, &branchOption, painter, m_view);
 
       // draw text
       // ...Покусано...
 
   } else {
       QItemDelegate::paint(painter, option, index);
   }
}
 

И следом возникает еще один вопрос, как отловить клик на этой иконке. А то получается что она свои функции (Разворачивание\Сворачивание элементов) не выполняет, и для разворачивания необходим 2-ой клик.
Буду очень признателен за любые подсказки и пинки в нужном направлении. (:
« Последнее редактирование: Октябрь 18, 2010, 17:56 от bmw » Записан
bmw
Гость
« Ответ #1 : Октябрь 24, 2010, 18:16 »

Все оказалось логичнее чем я предполагал.  Веселый
Это по поводу состояния "Раскрытости".

Код
Python
if(self.parent.clist.isExpanded(index)):
   branchOption.state |= QtGui.QStyle.State_Open;
 
Записан
lamazavr
Гость
« Ответ #2 : Февраль 15, 2011, 21:48 »

если можно опишите поподробннее как перерисовать иконки?
или ткните на статейки..
Записан
bmw
Гость
« Ответ #3 : Февраль 18, 2011, 16:49 »

Если в кратце, описываете класс делегата class SheetDelegate, наследованный от public QItemDelegate.
В котором, собственно, и перерисовываете item элементы.
Вот вам минимальный проект, думаю разберётесь.

Вот вам минимальный проект:
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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