qtcreator pyside2 para gui framework and python qt pyqt

python - pyside2 - qt5



¿Cómo usar Qt Delegates para pintar a medida? (1)

esto se puede resolver fácilmente con qt usando c ++: puede definir un nuevo estilo, anular el método drawPrimitive y hacer una pintura personalizada (o simplemente no hacer nada) siempre que se reciba la constante QStyle :: PE_IndicatorItemViewItemDrop a través del parámetro element . A continuación hay un ejemplo:

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()));

ahora la mala noticia es que pyqt no parece saber nada sobre QProxyStyle; parece que no está empaquetado allí, por lo que para que esto funcione, deberá ajustar las clases de estilo usted mismo.

otra solución es crear un descendiente QTreeView personalizado y anular su método paintEvent . La implementación predeterminada es llamar a drawTree y paintDropIndicator; donde paintDropIndicator es responsable del indicador de arrastrar y soltar, y drawTree renderiza los elementos del árbol. drawTree está protegido y disponible para que usted llame desde su evento paintEvent:

class TestTreeView : public QTreeView { public: explicit TestTreeView(QWidget *parent = 0) : QTreeView(parent) {} void paintEvent(QPaintEvent * event) { QPainter painter(viewport()); drawTree(&painter, event->region()); } };

esto debería suprimir el indicador de arrastrar y soltar predeterminado. Avíseme si tiene problemas para convertirlo a python.

espero que esto ayude, saludos

Estoy intentando anular la forma en que se dibujan QTreeWidgetItems cuando se arrastra un elemento sobre ellos. He reemplazado los eventos de arrastrar para establecer los datos de Qt.UserRole en 1 para QTreeWidgetItems que quiero pintar. En el Delegado de elementos, leo la UserRole y dibujo en consecuencia.

Mi pintura personalizada se muestra exactamente como se esperaba (es decir, la línea en negrita); sin embargo, no he podido descifrar cómo suprimir el dibujo realizado por el pintor estándar para arrastrar (es decir, el rectángulo pequeño) sin suprimir el resto de la pintura (es decir, el texto, etc.).

Cualquier idea sería apreciada.

Ex.

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()