- How to use Qt Delegates for custom painting?
- def dragMoveEvent(self, event):
- pos = event.pos()
- item = self.myTreeWidget.itemAt(pos)
- # If hovered over an item during drag, set UserRole = 1
- if item:
- index = self.myTreeWidget.indexFromItem(item)
- self.myTreeWidget.model().setData(index, 1, Qt.UserRole)
- # reset UserRole to 0 for all other indices
- for i in range(self.myTreeWidget.model().rowCount()):
- _index = self.myTreeWidget.model().index(i, 0)
- if not item or index != _index:
- self.myTreeWidget.model().setData(_index, 0, Qt.UserRole)
- class MyDelegate(QStyledItemDelegate):
- def paint( self, painter, option, index ):
- QStyledItemDelegate.paint(self, painter, option, index)
- painter.save()
- data = index.model().data( index, Qt.UserRole ).toInt()
- # if UserRole = 1 draw custom line
- if data[1] and data[0] == 1:
- line = QLine( option.rect.topLeft(), option.rect.topRight() )
- painter.drawLine( line )
- painter.restore()
- class TestStyle : public QProxyStyle
- {
- public:
- TestStyle(QStyle *baseStyle = 0) : QProxyStyle(baseStyle) {}
- void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const
- {
- if (element == QStyle::PE_IndicatorItemViewItemDrop)
- {
- //?? do nothing or do custom painting here
- }
- else
- {
- QProxyStyle::drawPrimitive(element, option, painter, widget);
- }
- }
- };
- ..
- ui->treeView->setStyle(new TestStyle(ui->treeView->style()));
- class TestTreeView : public QTreeView
- {
- public:
- explicit TestTreeView(QWidget *parent = 0) : QTreeView(parent) {}
- void paintEvent(QPaintEvent * event)
- {
- QPainter painter(viewport());
- drawTree(&painter, event->region());
- }
- };