Доброго времени суток! Возникла необходимость перерисовать иконки скрытия 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-ой клик.
Буду очень признателен за любые подсказки и пинки в нужном направлении. (: