如何隐藏 QGraphicScene 中的特定项目?

Posted

技术标签:

【中文标题】如何隐藏 QGraphicScene 中的特定项目?【英文标题】:How to hide specific items in QGraphicScene? 【发布时间】:2019-04-09 01:47:13 【问题描述】:

我的问题,我想根据我的 Ui 中的缩放级别“隐藏/显示”、“更改颜色”一些项目,但我完全迷失在所有 C+ 论坛中,因为我的 C+ 知识接近于 0。这里有一些代码:

from PySide2 import QtGui, QtCore, QtWidgets
from PySide2.QtCore import Signal

class testUi(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(testUi, self).__init__(parent)
        self.window = 'vl_test'
        self.title = 'Test Remastered'
        self.size = (1000, 650)

        self.create( )

    def create(self):
        self.setWindowTitle(self.title)
        self.resize(QtCore.QSize(*self.size))
        self.testik = test(self)

        self.mainLayout = QtWidgets.QVBoxLayout( )
        self.mainLayout.addWidget(self.testik)
        self.setLayout(self.mainLayout)


class test(QtWidgets.QGraphicsView):
    zoom_signal = Signal(bool)
    def __init__(self, parent=None):
        super(test, self).__init__(parent)
        self._scene = QtWidgets.QGraphicsScene()
        self.__zoom = 0
        self.setScene(self._scene)
        self.drawSomething( )
        self.setTransformationAnchor(QtWidgets.QGraphicsView.AnchorUnderMouse)
        self.setResizeAnchor(QtWidgets.QGraphicsView.AnchorUnderMouse)
        self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.setBackgroundBrush(QtGui.QBrush(QtGui.QColor(30, 30, 30)))
        self.setFrameShape(QtWidgets.QFrame.NoFrame)
        self.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding))

    def drawSomething(self):
        path = QtGui.QPainterPath( )
        path.moveTo(0, 0)
        path.addRect(20, 20, 60, 60)
        item = self._scene.addPath(path)
        item.setPen(QtGui.QPen(QtGui.QColor(79, 106, 25), 1, QtCore.Qt.SolidLine, QtCore.Qt.FlatCap, QtCore.Qt.MiterJoin))
        item.setBrush(QtGui.QColor(122, 163, 39))


    def wheelEvent(self, event):
        if event.angleDelta().y() > 0:
            factor = 1.25
            self.__zoom += 1
        else:
            factor = 0.8
        if self.__zoom > 0:
            self.scale(factor, factor)
        if self.__zoom > 10:
            self.zoom_signal.emit(True)
        elif self.__zoom < 10:
            self.zoom_signal.emit(False)
        else:
            self.__zoom = 0



if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = testUi()
    window.setGeometry(500, 300, 800, 600)
    window.show()
    sys.exit(app.exec_())

所以我有一些“wheelEvent”可以帮助我放大/缩小 QGraphicScene,我有“Rect”。如果缩放太大,我现在想隐藏 "Rect" 。感谢您的宝贵时间。

附言 我知道,这里很少有人总是帮助我逐步了解 Qt 并像婴儿一样用勺子喂我,我真的很感激!在这件事上我有点傻。

【问题讨论】:

【参考方案1】:

使用您的代码,变量self.__zoom 永远不会大于10,让我们分析一下我指出的内容:最初值是0,假设它在达到值9 时一个接一个地上升,现在表达式@987654322 @ 将导致值重置为 0,因此最好情况下的值将从 0 变为 9 并将被重置。所以那 else 是不必要的。如果去掉,变量就不能减少了,所以当delta为负时,应该减少值。

要使项目相对于zoom_signal 信号可见,它必须连接到setVisible() 方法。

考虑到上面的解决方案是:

def drawSomething(self):
    path = QtGui.QPainterPath( )
    path.moveTo(0, 0)
    path.addRect(20, 20, 60, 60)
    item = self._scene.addPath(path)
    item.setPen(QtGui.QPen(QtGui.QColor(79, 106, 25), 1, QtCore.Qt.SolidLine, QtCore.Qt.FlatCap, QtCore.Qt.MiterJoin))
    item.setBrush(QtGui.QColor(122, 163, 39))
    self.zoom_signal.connect(item.setVisible)


def wheelEvent(self, event):
    if event.angleDelta().y() > 0:
        factor = 1.25
        self.__zoom += 1
    else:
        factor = 0.8
        self.__zoom -= 1
    self.scale(factor, factor)
    self.zoom_signal.emit(self.__zoom < 10)

【讨论】:

我有点想知道这个信号是如何工作的。如果我想有相反的行为怎么办,它将在 5 之前隐藏,之后将显示。因为我不能传入“setVisibile”真假 @Vlad 更改为self.zoom_signal.emit(self.__zoom &gt; 5),并在item = self._scene.addPath(path) 之后添加item.hide()

以上是关于如何隐藏 QGraphicScene 中的特定项目?的主要内容,如果未能解决你的问题,请参考以下文章

Qt - 在QGraphicScene中拖放时如何从项目中获取文本?

如何根据特定条件在 RecyclerView 上为某些项目隐藏 ImageView?

如何根据 QGraphicScene 缩放/调整 QGraphicsWidget 的大小?

Qt QGraphicsView 和 QGraphicScene 鼠标位置

如何将 QML 映射添加到 QGraphicsscene?

如何隐藏滚动间谍中的其他内容而不是滚动到特定位置