игнорируется флаг pyqt «ItemIgnoresParentOpacity»

#python #pyqt #pyqt5 #qgraphicsitem

#python #pyqt #pyqt5 #qgraphicsitem

Вопрос:

Я потратил время, чтобы сделать минимальный воспроизводимый пример моей проблемы.

Используя PyQt5, у меня есть классическое главное окно с QGraphicsView, связанным с QGraphicsScene.

На сцене у меня есть NodeHover элемент (зеленый круг) с TreeNode дочерним элементом (квадрат). Элемент NodeHover по умолчанию прозрачен и становится непрозрачным при наведении курсора.

введите описание изображения здесь

Я хочу, чтобы его дочерний элемент ( TreeNode ) оставался непрозрачным все время, независимо от непрозрачности родительского элемента. Я попытался установить флаги в обоих элементах, как вы можете видеть ниже, но они, похоже, не работают.

 import sys
from PyQt5.QtWidgets import QGraphicsScene, QGraphicsView, QMainWindow, QApplication, QToolBar, QStatusBar, QAction, QGraphicsItem, QGraphicsLineItem, QLabel, QGraphicsEllipseItem, QGraphicsTextItem

from PyQt5.QtCore import *
from PyQt5.QtGui import QPainter, QIcon, QPen, QBrush, QTransform


class NodeHover(QGraphicsItem):
    def __init__(self, *args, **kwargs):
        super(NodeHover, self).__init__(*args, **kwargs)
        self.setOpacity(0.1)
        self.setAcceptHoverEvents(True)
        # Setting the flag so Item doesn't propagate its opacity to children
        self.GraphicsItemFlag(QGraphicsItem.ItemDoesntPropagateOpacityToChildren)

    def hoverEnterEvent(self, event):
        self.setOpacity(1) # When mouse enters item, make it opaque
    def hoverLeaveEvent(self, event):
        self.setOpacity(0.1) # When mouse leaves item, make it transparent

    def boundingRect(self):
        return QRectF(0,0, 20, 20)

    def paint(self, painter, option, widget):
        painter.setBrush(QBrush(Qt.green))
        painter.drawEllipse(QPointF(10, 10), 10, 10)

    
class TreeNode(QGraphicsItem):
    def __init__(self, *args, **kwargs):
        super(TreeNode, self).__init__(*args, **kwargs)
        # Setting the flag to ignore parent's opacity
        self.GraphicsItemFlag(QGraphicsItem.ItemIgnoresParentOpacity)

    def boundingRect(self):
        return QRectF(100, 100, 100, 100)

    def paint(self, painter, option, widget):
        painter.drawRect(110,110,80,80)


class GView(QGraphicsView):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.parent = parent
        self.setGeometry(100, 100, 700, 450)
        self.show()


class Scene(QGraphicsScene):
    def __init__(self, parent):
        super().__init__(parent)
        self.parent = parent
        hoverItem = NodeHover() # create a NodeHover item
        self.addItem(hoverItem)
        nodeItem = TreeNode()   # create a TreeNode item and make it hoverItem's child
        nodeItem.setParentItem(hoverItem)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(900, 70, 1000, 800)
        self.createGraphicView()
        self.show()

    def createGraphicView(self):
        self.scene = Scene(self)
        gView = GView(self)
        scene = Scene(gView)
        gView.setScene(scene)
        # Set the main window's central widget
        self.setCentralWidget(gView)

# Run program
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec_())
  

Ответ №1:

Чтобы установить флаг для QGraphicsItem, вы должны использовать setFlag() метод:

 self.setFlag(QGraphicsItem.ItemDoesntPropagateOpacityToChildren)
  
 self.setFlag(QGraphicsItem.ItemIgnoresParentOpacity)
  

Примечание: одного из этих флагов достаточно.

Комментарии:

1. Это отлично работает, как и ваше предыдущее решение. Большое спасибо за помощь, я не знаю, как я пропустил метод .SetFlag() в документации.